【本文原創於Silence•軒轅•寂的博客園技術博客。】
【本文歡迎轉載,轉載請以鏈接形式注明出處。】
【本博客所有文章都經博主精心整理,請尊重我的勞動成果。】
一,指針的運算
1,&和*運算符的優先級相同,且是自右向左結合的
單目運算符也是自右向左結合的,故*p++和(*p)++是不一樣的。而且*,++是具有相同的運算優先級的,故如*s++,++是作用於s的,而不是*s。
2,兩個指針有時候可以做減法運算,例如,若p,q指向同一數組中的元素,那麼p-q表示的是p,q之間的元素的個數。(並不是兩個地址值相減)
3,指針與整數的加減運算,表示指針相對當前位置的位移。如*(p+1)
4,指針在一定條件下可以比較(指向同一共用對象時),例如p,q指向同一數組,可以寫p>q;
二,指針變量作函數參數
函數執行後指針本身的值沒有改變,指針所指的內容改變了
如:void swap(*p,*q);
三,指針與數組
1,指向數組元素的指針
int a[10],*p;
p = &a[0];或者p = a;都是將第一個元素的地址賦給了p
C語言中數組名就是數組的首地址。
*(p+i)就表示a[i];
2,指針與一維數組
編譯系統對數組的處理方式,編譯系統總是將數組元素的形式
a[i]轉化為*(a+i)然後才進行運算
3,指針與多維數組
系統把二維數組看成是數組的數組來處理,即a[3][4]被看成是三個一維數組a[0],a[1],a[2],而每個數組又是四個元素組成的一維數組。例如引用a[2][3]時,系統將a[2]看成一個數組名(如上系統對數組的處理方法),將其轉化為
*(a[2]+3)
再對a[2]轉化,
*(*(a+2)+3)//在原來的一維數組中a[2]系統轉化為*(a+2),注意系統只從形式上去處理。
a[i][j]就是*(*(a+i)+j)
a[i][j][k]就是*(*(*(a+i)+j)+k)
注意反過來理解就是:*(a+i)+j是a[i][j]的地址;*(*(a+i)+j)+k是a[i][j][k]的地址,他們代表的並不是內容!
4,指向j個元素組成的一維數組的指針變量
如:
int a[3][4];
int (*p)[4];//定義具有四個元素的一維數組的指針變量p
p = a;
此時p+1指向a[1],這時p的增長以一維數組的長度為一個單位
*(p+2)+3就是a[2][3]的地址,*(*(p+2)+3)是a[2][3]的值;
注意這裡p的括號不能省略,否則int *p[4]表示的是指針數組;
5,指針數組和指向指針的指針
指針數組如int *p[4];
常用來處理若干個字符串,使字符串的處理更加方便;
指向指針的指針:
四,指針與函數
1,指向函數的指針
類型 (*指針變量名)()
例如 int (*funcp)();表示funcp被定義為一個指向返回值是整型量的函數的指針;
如:void swap(int x,int y);
void (*p)();
p = swap;
注意在定義指向函數的指針的時候,並不需要指定形參類型,另外第一個括號不可少,否則就是返回值為指針的函數。
可以把指向函數的指針變量作為函數參數,例如有int process(int x,int y,int (*func)()),process就可以調用不同的函數。
2,返回值為指針的函數;
五,字符串與指針
字符數組,字符串的處理等