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