指針是什么?——指針是一種數(shù)據(jù)類(lèi)型
形象的說(shuō),大家都知道“郵箱”與“郵箱里的信件”的關(guān)系吧!其實(shí)就是“地址”(指針)與“地址的內(nèi)容”(指針指向的內(nèi)容)的關(guān)系!
如圖:(耐煩的看,不耐煩的跳過(guò))
(自己畫(huà)的,有點(diǎn)粗糙,別怪我。)
圖中描述了6個(gè)內(nèi)存單元,它們的編號(hào)分別是從1000到1005的6個(gè)值,其中編號(hào)1000到1005就是相應(yīng)的內(nèi)存單元的地址。
數(shù)據(jù)存放在地址所標(biāo)識(shí)的內(nèi)存單元中。地址1000到1005多對(duì)應(yīng)的內(nèi)存單元就是用來(lái)存放數(shù)據(jù)的。
繼續(xù):把內(nèi)存單元想像成一個(gè)個(gè)“郵箱”,而內(nèi)存單元的數(shù)據(jù)就好比是“郵箱中的信件”,內(nèi)存單元的編號(hào)(地址)就好比是“郵箱的編號(hào)”。
(插一小段,耐煩的看,不耐煩的跳過(guò):如果在程序中定義一個(gè)變量,那么編譯是系統(tǒng)就會(huì)為變量分配一定數(shù)量的內(nèi)存單元。一般系統(tǒng)會(huì)為字符型的變量分配1個(gè)字節(jié)的儲(chǔ)存空間,為整型變量分配2個(gè)字節(jié)的儲(chǔ)存空間,浮點(diǎn)型的4個(gè)字節(jié))
總結(jié):1`地址起到一個(gè)指向作用。2`地址中還隱含有這個(gè)變量的類(lèi)型信息。
其實(shí),“指針”就是“地址”。通過(guò)“指針”可以找到以它為地址的內(nèi)存單元。一個(gè)變量的地址稱(chēng)為該變量的指針。
超級(jí)大推理:
——中心:一個(gè)變量的地址(指針)也是一個(gè)值。
→專(zhuān)門(mén)用來(lái)存放變量地址的變量,稱(chēng)為“指針變量”。
→所以“指針變量”的值是“指針”(一個(gè)變量的地址)。
指針的運(yùn)算:指針就地址。C語(yǔ)言中的地址是無(wú)符整數(shù)。
對(duì)于指針變量,允許的主要運(yùn)算有:1`指針變量的賦值。2`指針與整數(shù)之間的加減運(yùn)算。3`指針之間的比較。4`指針之間的加減運(yùn)算。
=================================================================================
形象的說(shuō),大家都知道“郵箱”與“郵箱里的信件”的關(guān)系吧!其實(shí)就是“地址”(指針)與“地址的內(nèi)容”(指針指向的內(nèi)容)的關(guān)系!
指針的概念更像一個(gè)郵遞員!
至于老K說(shuō)的:指針不是地址,指什變量的值是一個(gè)地址.
解釋下:
大家還記得高中數(shù)學(xué)中一個(gè)概念嗎:向量(物理稱(chēng) 矢量)
向量有雙要素:方向 和 模長(zhǎng)
同樣,指針 是 向量 的計(jì)算機(jī)化(就像是 數(shù)組 是 數(shù)列 的計(jì)算機(jī)化一樣)
當(dāng)定義一個(gè) 指針變量 的時(shí)候,計(jì)算機(jī)分配給它空間,用這個(gè)空間來(lái)存放地址
我們把一個(gè)值賦給一個(gè)變量,那么這個(gè)空間存放的值就是這個(gè)變量的值
同樣道理,我們把一個(gè)地址(無(wú)符號(hào)整型)賦給一個(gè)指針變量,那么這個(gè)空間存放的地址就是這個(gè)指針變量的值
而這個(gè)概念就是 方向 !
而模長(zhǎng)的概念就是 *p !
也許還有人聽(tīng)不明白,我用C語(yǔ)言程序來(lái)說(shuō)明:
我們常常利用 指針 來(lái)改變被傳遞到自定義函數(shù)的值(實(shí)參),讓 改變的值 返回主函數(shù)!
而這個(gè) 改變的值 是指針?biāo)赶虻?地址上 的 改變的值 (紅色部分代碼)
而 不是 改變了 指針的指向 (藍(lán)色部分代碼)!
#include
int main()
{
int *p,*q,a=1,b=2;
int change(int *,int *);
p=&a;q=&b;
change(p,q);
printf("%d,%d\n",*p,*q);
getch();
return 0;
}
int change(int *x,int *y)
{
int *z;
z=x;x=y;y=z;//這里改變了指針的地址,但是結(jié)果卻沒(méi)有改變,因?yàn)橹羔樀闹凳堑刂?,是不?huì)被傳遞回主函數(shù)的
}
PS:
int change(int *x,int *y)
{
int z;
z=*x;*x=*y;*y=z;//它改變了指針?biāo)赶虻闹担菦](méi)有改變指針的地址!
}
注意藍(lán)色部分如果把 *z 改成 z (或者紅色部分 z 改成 *z )都是不可以的!
因?yàn)閕nt *z;那么z的空間就是用來(lái)存放地址,雖然你也可以認(rèn)為這樣可以傳遞,但是如果是聰明的編譯器就會(huì)警告,不聰明的編譯器就會(huì)報(bào)錯(cuò)
所以還是請(qǐng)大家規(guī)范書(shū)寫(xiě)!
形象的說(shuō),大家都知道“郵箱”與“郵箱里的信件”的關(guān)系吧!其實(shí)就是“地址”(指針)與“地址的內(nèi)容”(指針指向的內(nèi)容)的關(guān)系!
如圖:(耐煩的看,不耐煩的跳過(guò))
(自己畫(huà)的,有點(diǎn)粗糙,別怪我。)
圖中描述了6個(gè)內(nèi)存單元,它們的編號(hào)分別是從1000到1005的6個(gè)值,其中編號(hào)1000到1005就是相應(yīng)的內(nèi)存單元的地址。
數(shù)據(jù)存放在地址所標(biāo)識(shí)的內(nèi)存單元中。地址1000到1005多對(duì)應(yīng)的內(nèi)存單元就是用來(lái)存放數(shù)據(jù)的。
繼續(xù):把內(nèi)存單元想像成一個(gè)個(gè)“郵箱”,而內(nèi)存單元的數(shù)據(jù)就好比是“郵箱中的信件”,內(nèi)存單元的編號(hào)(地址)就好比是“郵箱的編號(hào)”。
(插一小段,耐煩的看,不耐煩的跳過(guò):如果在程序中定義一個(gè)變量,那么編譯是系統(tǒng)就會(huì)為變量分配一定數(shù)量的內(nèi)存單元。一般系統(tǒng)會(huì)為字符型的變量分配1個(gè)字節(jié)的儲(chǔ)存空間,為整型變量分配2個(gè)字節(jié)的儲(chǔ)存空間,浮點(diǎn)型的4個(gè)字節(jié))
總結(jié):1`地址起到一個(gè)指向作用。2`地址中還隱含有這個(gè)變量的類(lèi)型信息。
其實(shí),“指針”就是“地址”。通過(guò)“指針”可以找到以它為地址的內(nèi)存單元。一個(gè)變量的地址稱(chēng)為該變量的指針。
超級(jí)大推理:
——中心:一個(gè)變量的地址(指針)也是一個(gè)值。
→專(zhuān)門(mén)用來(lái)存放變量地址的變量,稱(chēng)為“指針變量”。
→所以“指針變量”的值是“指針”(一個(gè)變量的地址)。
指針的運(yùn)算:指針就地址。C語(yǔ)言中的地址是無(wú)符整數(shù)。
對(duì)于指針變量,允許的主要運(yùn)算有:1`指針變量的賦值。2`指針與整數(shù)之間的加減運(yùn)算。3`指針之間的比較。4`指針之間的加減運(yùn)算。
=================================================================================
形象的說(shuō),大家都知道“郵箱”與“郵箱里的信件”的關(guān)系吧!其實(shí)就是“地址”(指針)與“地址的內(nèi)容”(指針指向的內(nèi)容)的關(guān)系!
指針的概念更像一個(gè)郵遞員!
至于老K說(shuō)的:指針不是地址,指什變量的值是一個(gè)地址.
解釋下:
大家還記得高中數(shù)學(xué)中一個(gè)概念嗎:向量(物理稱(chēng) 矢量)
向量有雙要素:方向 和 模長(zhǎng)
同樣,指針 是 向量 的計(jì)算機(jī)化(就像是 數(shù)組 是 數(shù)列 的計(jì)算機(jī)化一樣)
當(dāng)定義一個(gè) 指針變量 的時(shí)候,計(jì)算機(jī)分配給它空間,用這個(gè)空間來(lái)存放地址
我們把一個(gè)值賦給一個(gè)變量,那么這個(gè)空間存放的值就是這個(gè)變量的值
同樣道理,我們把一個(gè)地址(無(wú)符號(hào)整型)賦給一個(gè)指針變量,那么這個(gè)空間存放的地址就是這個(gè)指針變量的值
而這個(gè)概念就是 方向 !
而模長(zhǎng)的概念就是 *p !
也許還有人聽(tīng)不明白,我用C語(yǔ)言程序來(lái)說(shuō)明:
我們常常利用 指針 來(lái)改變被傳遞到自定義函數(shù)的值(實(shí)參),讓 改變的值 返回主函數(shù)!
而這個(gè) 改變的值 是指針?biāo)赶虻?地址上 的 改變的值 (紅色部分代碼)
而 不是 改變了 指針的指向 (藍(lán)色部分代碼)!
#include
int main()
{
int *p,*q,a=1,b=2;
int change(int *,int *);
p=&a;q=&b;
change(p,q);
printf("%d,%d\n",*p,*q);
getch();
return 0;
}
int change(int *x,int *y)
{
int *z;
z=x;x=y;y=z;//這里改變了指針的地址,但是結(jié)果卻沒(méi)有改變,因?yàn)橹羔樀闹凳堑刂?,是不?huì)被傳遞回主函數(shù)的
}
PS:
int change(int *x,int *y)
{
int z;
z=*x;*x=*y;*y=z;//它改變了指針?biāo)赶虻闹担菦](méi)有改變指針的地址!
}
注意藍(lán)色部分如果把 *z 改成 z (或者紅色部分 z 改成 *z )都是不可以的!
因?yàn)閕nt *z;那么z的空間就是用來(lái)存放地址,雖然你也可以認(rèn)為這樣可以傳遞,但是如果是聰明的編譯器就會(huì)警告,不聰明的編譯器就會(huì)報(bào)錯(cuò)
所以還是請(qǐng)大家規(guī)范書(shū)寫(xiě)!