在C語言編程中指針經常困擾着我們,但是若能靈活運用指針的話,將會使得我們編程變得更加輕松與高效。這里講下*p[N], (*P)[N],及**p的區別,這也是之前經常困擾我的地方。
這三者的定義分別為:
int *p[N]表示指針數組,也就是說定義了N個不同指向int型的指針。
int (*p)[N]表示定義一個指針,指向一個int[N]型的指針。
int **p 表示定義一個指向指針的指針。
注意[]的優先級要高於*。
指針即表示一個存放某種數據類型變量的地址,例如:
#include <stdio.h> #include <math.h> int main() { int *p, i; int a[3]; p = a; for(i=0; i<3; i++) a[i] = i; printf("%d\t%d\n", *(p+1), a[1]);
return 1; }
這里p存儲的是數組a的首地址,且為int類型,那么p+1表示p向后移動一個int型的字節得到的地址,也就是a[1]的地址。
上述結果即為:
1 1
下面通過一些例子來說明這些指針*p[N], *p[N]和**p的區別。
#include <stdio.h> int main(int argc, char* argv[]) { int i, j; int (*p1)[3], *p2[3], **p3; int b[3][3]; for(i=0; i<3; i++ ) for(j=0; j< 3; j++) b[i][j] = 2*i + j; p1 = b; for(i=0; i< 3; i++) p2[i] = b[i]; p3 = malloc(3 * sizeof(*p3)); for(i=0; i< 3; i++) *(p3+i) =b[i]; printf("the matrix is :\n"); for(i=0; i< 3; i++) { for(j=0; j< 3; j++) printf("%d\t", b[i][j]); printf("\n"); } printf("%d\t%d\t%d\n", *(*(p1+1)+1), *(p2[1]+1), *(*(p3+1)+1)); }
解釋說明:
*p[3]表示一個指針數組,可以理解為定義了三個指針*p1[0], *p1[1], *p[2],在該例子中分別將b[0]的地址賦值給p[0],b[1]的地址賦值給p[2],...,因此*(p2[1]+1)表示的是*(b[1]+1)的值,也就是b[1][1].
**p表示一個指向指針的指針,也可以理解為p存儲的是一個地址的地址。比如在該例子中,{b[0], b[1], b[2]}可以認為是一個數組,里面的元素為一個地址,p存儲的是該數組的初始地址,也就是說*p指向的是該數組的第一個元素(*(p+1)表示這個數組的第二個元素),但注意到這第一個元素還是一個地址,其相當數組b[0]的首地址,因此*(*(p3+1)+1)相當於*(b[1]+1),也就是b[1][1]
(*p)[3]改變了自然的運算符的優先級,相當於(int)((*p)[3])。一有指針就頭疼,我們把指針先替換掉,就是int a[n],是一個n維數組,數組首地址(也就是數組名)是a。那么,int (*p)[n]也是一個n維數組,但是這個數組的首地址是*p,也就是說,p指向的內容,是一個數組的首地址。那么,p就是指向一個數組的指針,這個數組中的元素都是int。實際上,p3相當於一個二重指針,這個和**p其實差不多。
以上是我關於指針的一些個人理解,若有錯誤之處,希望廣大網友指出,
參考博文:http://blog.csdn.net/ywb201314/article/details/52062059