在本教程中,您將學習指針。什么是指針,如何使用它們以及在示例的幫助下使用它們時可能遇到的常見錯誤。
指針是 C和C ++ 編程的強大功能。在學習指針之前,讓我們學習一下C語言編程中的地址。
如果程序中有變量var,則&var將在內(nèi)存中提供其地址。
使用scanf()函數(shù)時,我們已多次使用地址。
scanf("%d", &var);
在此,用戶輸入的值存儲在var變量的地址中。讓我們舉一個可行的實例。
#include <stdio.h> int main() { int var = 5; printf("var: %d\n", var); // 注意在var之前使用& printf("address of var: %p", &var); return 0; }
輸出結(jié)果
var: 5 var地址: 2686778
注意:運行上面的代碼時,您可能會獲得其他地址。
指針(指針變量)是用于存儲地址而非值的特殊變量。
這是我們?nèi)绾温暶髦羔樀姆椒ā?/p>
int* p;
在這里,我們已經(jīng)聲明了一個int類型的指針p。
您也可以通過以下方式聲明指針。
int *p1; int * p2;
讓我們再舉一個聲明指針的實例。
int* p1, p2;
在這里,我們聲明了一個指針p1和一個普通變量p2。
讓我們舉個實例。
int* pc, c; c = 5; pc = &c;
在此,將5分配給c變量。并且,將c的地址分配給pc指針。
為了獲得指針所指向的內(nèi)容的值,我們使用了解引用運算符(*)。例如:
int* pc, c; c = 5; pc = &c; printf("%d", *pc); // 輸出: 5
此處,c的地址已分配給pc指針。為了獲取存儲在該地址中的值,我們使用了*pc。
讓我們舉個實例。
int* pc, c; c = 5; pc = &c; c = 1; printf("%d", c); // 輸出: 1 printf("%d", *pc); // 輸出: 1
我們已經(jīng)將c地址分配給了pc指針。
然后,我們將的值更改c為1。由于pc和的地址c相同,因此*pc得到1。
讓我們再舉一個實例。
int* pc, c; c = 5; pc = &c; *pc = 1; printf("%d", *pc); // 輸出: 1 printf("%d", c); // 輸出: 1
我們已經(jīng)將c地址分配給了pc指針。
然后,我們使用* pc = 1;將* pc更改為1。 由于pc和c的地址相同,因此c等于1。
讓我們再舉一個實例。
int* pc, c, d; c = 5; d = -15; pc = &c; printf("%d", *pc); // 輸出: 5 pc = &d; printf("%d", *pc); // 輸出: -15
最初,使用的地址c分配給pc指針pc = &c;。因為c是5,所以*pc給我們5。
然后,使用將地址d分配給pc指針pc = &d;。由于d是-15,所以*pc給我們-15。
讓我們舉一個可行的實例。
#include <stdio.h> int main() { int* pc, c; c = 22; printf("c的地址: %p\n", &c); printf("c的值: %d\n\n", c); // 22 pc = &c; printf("指針pc地址: %p\n", pc); printf("指針pc內(nèi)容: %d\n\n", *pc); // 22 c = 11; printf("指針pc地址: %p\n", pc); printf("指針pc內(nèi)容: %d\n\n", *pc); // 11 *pc = 2; printf("c的地址: %p\n", &c); printf("c的值: %d\n\n", c); // 2 return 0; }
輸出結(jié)果
c的地址: 003FFBF8 c的值: 22 指針pc地址: 003FFBF8 指針pc內(nèi)容: 22 指針pc地址: 003FFBF8 指針pc內(nèi)容: 11 c的地址: 003FFBF8 c的值: 2
該程序的用法
int* pc, c;
這里創(chuàng)建了一個指針pc和一個普通變量c,都是int類型。由于pc和c沒有初始化在最初,指針pc指向沒有地址或一個隨機地址。變量c有一個地址,但包含隨機的垃圾值。
c = 22;
這是給變量c賦值22,也就是說,22被存儲在變量c的內(nèi)存中。
pc = &c;
這將變量c的地址分配給指針pc。
c = 11;
這將11分配給變量c。
*pc = 2;
這會將指針pc指向的內(nèi)存位置的值更改為2。
假設(shè)您希望指針pc指向c的地址。 然后,
int c, *pc; //pc是地址,但c不是 pc = c; // Error //&c是地址,但* pc不是 *pc = &c; // Error //&c和pc都是地址 pc = &c; //c和*pc值 *pc = c;
這是指針語法初學者經(jīng)常會感到困惑的示例。
#include <stdio.h> int main() { int c = 5; int *p = &c; printf("%d", *p); // 5 return 0; }
使用時為什么沒有出現(xiàn)錯誤int *p = &c;?
這是因為
int *p = &c;
相當于
int *p: p = &c;
在這兩種情況下,我們都創(chuàng)建了一個指針p(不是*p)并給它賦值&c。
為了避免這種混亂,我們可以使用如下語句:
int* p = &c;
現(xiàn)在您知道了什么是指針,您將在下一個教程中學習指針與數(shù)組的關(guān)系。