指針
明白地址的概念之后,指針也就不奇怪了。簡(jiǎn)單地講,地址就是邏輯內(nèi)存上的編號(hào),而指針雖然也表示一個(gè)編號(hào),也是一個(gè)地址。但兩者性質(zhì)卻不相同。一個(gè)代表了常量,另一個(gè)則是變量。就好比內(nèi)存是一把尺子,而指針就是尺子上面的游標(biāo),可以左右移動(dòng),它某一個(gè)時(shí)刻是指向一個(gè)地方的,這就是指針變量。
對(duì)指針變量定義的一般形式為:
類型說(shuō)明符 *變量名;
其中,這里的*與前面的類型說(shuō)明符共同說(shuō)明這是一個(gè)指針變量,類型說(shuō)明符表示該指針變量所指向的變量為何種數(shù)據(jù)類型,變量名即為定義的指針變量名。除此之外,C還提供*運(yùn)算符獲取地址上對(duì)應(yīng)的值,例如:
#include<stdio.h> int main() { int num=2014; int *p=# printf("num Address = 0x%x,num=%d\n",&num,num); printf("p = 0x%x,*p=%d\n",p,*p); printf("%d\n",*&num); return 0; }
請(qǐng)親自運(yùn)行觀察結(jié)果并思考。
值得一提的是,由于指針存放的都是地址,在32位操作系統(tǒng)下都在0~4,294,967,295這個(gè)數(shù)區(qū)間內(nèi),所以,在32位操作系統(tǒng)下,任何類型的指針變量都占四個(gè)字節(jié)!
#include<stdio.h> struct INFO { int a; char b; double c; }; int main() { int *p; char *p1; float *p2; double *p3; struct INFO *p4; //struct INFO類型為結(jié)構(gòu)體類型 我們將會(huì)在后面的章節(jié)中講解 void *p5; printf("int point size is :%d\n",sizeof(p)); printf("char point size is :%d\n",sizeof(p1)); printf("float point size is :%d\n",sizeof(p2)); printf("double point size is :%d\n",sizeof(p3)); printf("struct point size is :%d\n",sizeof(p4)); printf("void point size is :%d\n",sizeof(p5)); return 0; }
請(qǐng)您親自上機(jī)運(yùn)行并觀察結(jié)果。
C語(yǔ)言網(wǎng)提供由在職研發(fā)工程師或ACM藍(lán)橋杯競(jìng)賽優(yōu)秀選手錄制的視頻教程,并配有習(xí)題和答疑,點(diǎn)擊了解:
一點(diǎn)編程也不會(huì)寫的:零基礎(chǔ)C語(yǔ)言學(xué)練課程
解決困擾你多年的C語(yǔ)言疑難雜癥特性的C語(yǔ)言進(jìn)階課程
從零到寫出一個(gè)爬蟲的Python編程課程
只會(huì)語(yǔ)法寫不出代碼?手把手帶你寫100個(gè)編程真題的編程百練課程
信息學(xué)奧賽或C++選手的 必學(xué)C++課程
藍(lán)橋杯ACM、信息學(xué)奧賽的必學(xué)課程:算法競(jìng)賽課入門課程
手把手講解近五年真題的藍(lán)橋杯輔導(dǎo)課程