C語言10個小知識了解指針
1.若有代碼
int a=10,*p;p是指針:也是壹個變量,且是壹個只能用來存放地址的變量。
2.若有代碼int a=10,*p;p=&a;當執行了上面的代碼,會說”p指向了a”,其實就是p指針變量存放了a的地址”
3.兩個*的區別,有如下代碼:
inta=10,*p;//該處的* 說明p是壹個指針變量用來存放地址p=&a;
*p=*p+1;//該處的* 表示p所指的變量中的值即a的值10
總結: 變量定義時的* 說明該變量是壹個指針,調用語句中的* 表示指針指向的變量中的值。[此處是比較容易混淆的]
4.int a=10,*p;p=&a;
則:*p=*p+1;//等價:*p +=1; (0)十十
++(*p);
表示的內容相同,都是p所指變量的值+1。
5. *p++和(*p)++的區別是:
等價於* (p++),先獲取 p 當前所指元素的值,然後p指針+1(p指針向後移動壹個單元,壹般用在數組中,普通變量會越界);後者僅僅是p所指變量的值+1。
6.定義變量時,
壹個*說明該變量是指針,兩個*說明該變量是指向指針的指針(存放的是指針變量的地址)
int a=10,*p,**q;p=&a;//p指向a,*p的結果是10q=&p;//g 指向p,*q的結果是p的地址值,**q的結果才是10
7,如果調用函數傳遞的是地址,那麽被調函數中形參就需要使用指針接收,在函數中對指針所指變量值的改變,會影響到調用函數中的變量值。執行結果:如圖所示
8.壹維數組名和指針的區別,有定義:
int a[10l,*p;
p=a;//合法
因為,壹維數組名存的是數組首地址,這樣使 p指向了a首地址,也就是第壹個元素的地址。a++;/ /不合法
因為a是壹個地址常量,開辟了就不能再修改了,壹切給數組名字賦值的操作都是非法的。
p++://合法因為p是壹個指針,p++表示從當前向後移動了壹個位置。
對幹上面的定義,a[i]、* (ati)、* (p+i)、p[]都是合法,都是取下標為i的元素值。所以: p++; 是使指針向後移動,(*p) +十是當前所指變量的值內容+1.
9,若有定義:
int a[3][22],*p[3l,iJ;
*p[3]中[優先級[高於*,說明p是壹個數組名,前面的*說明該數組中每個元素都用來存放指針,這叫指針數組。
如果p和a產生聯系,則只能通過逐個賦值的方式完成,即: for(i=0;i<3;i++)p[] =a[l; //合法
因為a[] 是二維數組中每行的首地址,所以可以存放到p數組中。
但是 p=a;是非法的,因為a是地址,p是數組的名字,並不是指針名下面獲取數組元素的方式都是合法的:
*(pl[il+j) *(*(p+i)+j) (*(p+i))lj]
10.若自定義函數的實參是壹維數組名,則該函數的首部可以寫成:?
fun (int al) fun (int a[M]) fun
(int*a) M表示長度若有自定義函數的實參是二維數組名,則該函數的首部可以寫成: fun(int (a)[N])fun(int al[N]) fun(int a[M][N]) M表示行數,N表示列數
若有指針數組作為fun函數的實參,則該函數的首部可以寫成:
fun(int *a[M]) fun(int *al) fun(int**a)