終于要講到指針了,幾乎每個(gè)人在學(xué)習(xí)C語(yǔ)言的時(shí)候都會(huì)說(shuō)指針是最難學(xué)的一部分。接下來(lái)的幾篇中,我們會(huì)通過(guò)各種例子詳細(xì)地說(shuō)明指針的用法,力求讓大家不再見(jiàn)到指針就害怕。
在學(xué)習(xí)之前,請(qǐng)先看一下博主的另外一篇文章21天C語(yǔ)言代碼訓(xùn)練營(yíng)(第四天)看了這篇文章,你會(huì)了解指針和數(shù)組的內(nèi)在關(guān)系,同時(shí)方便大家通過(guò)數(shù)組來(lái)理解指針的概念。
大家要時(shí)刻記住一句話:指針就是一個(gè)地址,數(shù)組名就是指針。
下面我們開(kāi)始講解指針的基礎(chǔ)知識(shí)。
地址與指針
C語(yǔ)言中的取地址運(yùn)算符是“&”,通過(guò)在變量前加這個(gè)符號(hào)表示變量的地址。如:
float x;
int a[10];
printf("%d %d", &x, &a[0]);
這段代碼打印出的是x的地址和數(shù)組a首個(gè)元素的地址。
最容易被混淆的一對(duì)概念就是“變量的指針和指針變量”。
- 變量的指針:某個(gè)變量的地址(指針就是地址)
- 指針變量:存放地址的變量。
如int* p;中,p是指針變量,變量的指針是p中保存的地址。
指針變量的定義
1. 格式
數(shù)據(jù)類(lèi)型* 指針變量名;
如:
int* p1;
char* p2;
注意:
- 指針變量是p1和p2,不是*p1,*p2
- 在沒(méi)有賦值之前,指針變量中的地址是一個(gè)隨機(jī)值
2. 賦值
指針變量指向一個(gè)確定的變量必須進(jìn)行賦值,如:
int *p, a;
a = 10;
p = &a;
這段代碼前兩行p和a沒(méi)有任何關(guān)系,當(dāng)執(zhí)行到第三行時(shí),指針變量p才保存了a的地址。我們習(xí)慣說(shuō)p指向了a。
指針變量的引用
1. 指針運(yùn)算符 *
我們用*p表示指針變量p中保存的值。p = &a;中*p相當(dāng)于a。
經(jīng)常在各種考試題中出現(xiàn)的一些關(guān)系:
- &*p 相當(dāng)于 &(*p) 相當(dāng)于 &a
- *&a 相當(dāng)于 *(&a) 相當(dāng)于 *p 相當(dāng)于 a
2. 指針的自加和自減
當(dāng)*與++、--共同使用時(shí),經(jīng)常會(huì)出現(xiàn)混淆。例如:
int a = 2;
int* p = &a;
- (*p)++
相當(dāng)于
a++;
- *p++
int c = *p++;
相當(dāng)于
int c = *p;
p++;
- *++p
int c = *++p;
相當(dāng)于
++p;
int c = *p;
練習(xí)
這里要說(shuō)的是學(xué)習(xí)指針中的一個(gè)經(jīng)典例子。請(qǐng)看下面這段代碼:
int main()
{
int a = 5, b = 3, t;
int* p1 = &a;
int* p2 = &b;
int* p;
printf("a : %d, b : %d\n", a, b);
printf("*P1 : %d, *p2 : %d\n", *p1, *p2);
p = p1;
p1 = p2;
p2 = p;
printf("a : %d, b : %d\n", a, b);
printf("*P1 : %d, *p2 : %d\n", *p1, *p2);
return 0;
}
這個(gè)程序完成了p1,p2兩個(gè)指針變量的交換。需要注意的是,在交換過(guò)程中,我們只是讓兩個(gè)指針變量保存的地址進(jìn)行了交換,而a和b兩個(gè)變量沒(méi)有發(fā)生任何變化。
我是天花板,讓我們一起在軟件開(kāi)發(fā)中自我迭代。
如有任何問(wèn)題,歡迎與我聯(lián)系。
上一篇:C語(yǔ)言從零開(kāi)始(十五)-二維數(shù)組
下一篇:C語(yǔ)言從零開(kāi)始(十七)-指針2