簡(jiǎn)介
本質(zhì):指針是一個(gè)值為內(nèi)存地址的變量漱办。
假設(shè)一個(gè)指針變量名為ptr:
ptr = &pooh; // 把pooh的地址賦值給ptr
我們可以說(shuō),把ptr指向pooh.即ptr為變量旁壮,&pooh為常量偶宫。
間接運(yùn)算符:*
ptr = &bah;
val = *ptr; // 找出ptr指向的值賦值給val
歸納上面的兩句可以得到:
val =bah;
指針的聲明
聲明一個(gè)指針變量時(shí)一定要指定指針?biāo)傅淖兞康念愋停驗(yàn)椴煌淖兞款愋驼加貌煌拇鎯?chǔ)空間毕泌。
int *pi; // 指向int類型變量的指針
char *pc; // 指向char 類型指針
float *pf,*pg; // 指向浮點(diǎn)類型指針
2.4 指針在函數(shù)中的通信
我們首先來(lái)看兩個(gè)栗子:
輸出結(jié)果為:
輸出結(jié)果為:
因此喝检,我們可以做到把變量的兩類信息傳遞給函數(shù):
function1(x);//要求參數(shù)是必須跟x一個(gè)數(shù)據(jù)類型;
function1(&x);// 要求參數(shù)必須指向一個(gè)正確類型的指針撼泛。
因此如果要在被調(diào)函數(shù)中改變主調(diào)函數(shù)的變量挠说,需要用第二種形式。
指針與數(shù)組
flizny == &flizny[0]; //數(shù)組名也可以表示數(shù)組首元素地址
下面先看看一個(gè)例子:
輸出結(jié)果如下:
總結(jié):在C中愿题,指針加1是增加一個(gè)存儲(chǔ)單元损俭,對(duì)數(shù)組來(lái)說(shuō),這意味著把加一后的地址就是下個(gè)元素的地址潘酗,即:
dates + 2 == &dates[2]; // 相同地址
*(dates +2) == dates[2]; //相同的值
注意
*(dates +2) // dates的第三個(gè)元素的值
*dates +2 // dates的第一個(gè)元素加2
函數(shù)杆兵,數(shù)組和指針
函數(shù)在在聲明數(shù)組形參時(shí)可以省略數(shù)組名,下面幾種原型是等價(jià)的:
int sum(int *ar,int n);
int sum(int *,int);
int sum(int ar[],int n);
int sum(int [],int);
函數(shù)在定義時(shí)崎脉,不能省略參數(shù)名拧咳,下面幾種定義師等價(jià)的:
int sum(int *ar,int n){
}
int sum (int ar[],int n){
}
指針操作
先看一個(gè)例子:
輸出結(jié)果為:
總結(jié)
賦值: ----- 地址應(yīng)該和指針類型兼容,也就是說(shuō)不能把double類型的地址賦值指向int類型的指針囚灼。
取址: ------指針變量也有自己的地址和值骆膝,&運(yùn)算符可以取到指針本身的地址,上例中0x7fff5fbff7e8的地址上灶体,存儲(chǔ)的是0x7fff5fbff800阅签,即urn的地址,因此&ptr1是指向ptr1的指針蝎抽,而ptr1是指向utn[0]的指針政钟。
指針求差:-----通常, 求差的兩個(gè)指針的兩個(gè)指針分別指向同一個(gè)數(shù)組的不同元素樟结,這樣計(jì)算可以求出兩個(gè)元素之間的差值养交,上例中兩者之差是2,表示兩個(gè)指針指向的元素相差2個(gè)int瓢宦。
解引用未初始化的指針:
int *pt; // 未初始化的指針
*pt =5; // 出現(xiàn)錯(cuò)誤
指針與多重?cái)?shù)組
int zippo[4][2]; // 內(nèi)含int 數(shù)組的數(shù)組
zippo與&zippo[0]的值相同碎连,前者是占有2個(gè)int大小對(duì)象地址,后者就一個(gè)int大小地址驮履,因?yàn)殚_始地址相同所以值相同鱼辙。
zippo +1 與zippo[0]+1值不同
*(zippo[0]) 表示存儲(chǔ)在zippo[0][0];
*zippo 和&zippo[0][0]是等價(jià)的
**zippo 和*&zippo[0][0]等價(jià)
下面看個(gè)具體的例子:
zippo[0]+1 // 地址增加4個(gè)字節(jié)
zippo +1 // 地址增加八個(gè)字節(jié)
zippo[2][1]等價(jià)寫法:*(*(zippo +2)+1)
下面進(jìn)行分析:
zippo+2 //表示二維數(shù)組第三個(gè)元素
*(zippo +2) //第三個(gè)元素的首元素地址
*(zippo +2) +1 // 第三個(gè)元素的第二個(gè)元素地址
*( *(zippo +2) +1) // zippo[2][1]
指向多維數(shù)組的指針
int (*pz)[2] 廉嚼; //pz指向一個(gè)內(nèi)含2個(gè)int 類型的值的數(shù)組
int *pz[2]; // pax是一個(gè)內(nèi)含兩個(gè)指針元素的數(shù)組倒戏,每個(gè)元素都指向int 的指針
下面看個(gè)例子
總結(jié):
zippo[m][n] == *(*(zippo+m)+n);
pz[m][n] == *(*(pz+m)+n)
函數(shù)與多維數(shù)組
聲明函數(shù)形參如下:
void somefunction(int (*pt)[4]);
也可以第一個(gè)括號(hào)是空的怠噪,但第二個(gè)不可以
void somefunction (int pt[][4]);
以上內(nèi)容為本人學(xué)習(xí)筆記,相關(guān)示例參考《C Primer Plus》(第6版)中文版杜跷。