陣列名和陣列名加地址符的區別(瞭解指標)
阿新 • • 發佈:2019-01-01
問題發現在int *p[4]和int (*ip)[4]的區別?
為了明白這個區分,做個小例子驗證
以下是驗證程式碼
int *p[4];
int a=0;
int *q=NULL;
p[0]= &a;
p[1]=q;
int (*ip)[4];
int arr[4]={1,2,3,4};
ip=&arr;// 當我(ip = arr;)不用地址符號的時候是編譯不過的
int brr[4]={11,22,33,44};
ip = &brr;// 當我(ip = brr;)不用地址符號的時候是編譯不過的
為什麼編譯不過呢?
陣列名是指標,指向陣列中第一個元素的。
陣列名加地址符的時候就指向整個陣列的地址。
為了驗證這個問題的正確性,以下是例子:
可以看出結論是正確的,a和&a的區別就是指向的地址陣列的地址和陣列首個元素的地址一樣,但型別不一樣,&a是指向陣列的地址,加一就相當於加了整個陣列的長度。而a+1就相當於加了一個元素的值。
int a[2] = {1,2};
printf("a=%p\n",a);
printf("&a=%p\n",&a);
printf("a+1 = %p\n",a + 1);
printf("&a+1 = %p\n",&a + 1);
執行結果如下:
int a[4] = {1,2,4,7};
printf("a=%p\n",a);
printf("&a=%p\n",&a);
printf("a+1 = %p\n",a + 1);
printf("&a+1 = %p\n",&a + 1);
執行結果如下: