參考[1] http://blog.chinaunix.net/uid-30254479-id-5066996.html
0.問題
用數組名給指針賦值warning: initialization from incompatible pointer type
示例代碼如下:
int a[5]={1,2,3,4,5};
int (*p)[5]= a;
產生編譯告警warning: initialization from incompatible pointer type。
代碼修改如下後告警消失:
int a[5]={1,2,3,4,5};
int (*p)[5]= &a;
原因:
儘管a 和&a的值是一樣的,都是數組的首地址,但是類型不一樣:
a作爲地址是 int *類型的,
&a地址是int (*)[5]類型的,
並且p也是int (*)[5]類型的
1.驗證
#include<stdio.h>
int main(void)
{
int a[5] = {1,2,3,4,5};
int (*p)[5] = &a;
printf("a = %p\n", a);
printf("&a = %p\n", &a);
printf("p = %p\n", p);
printf("p+1 = %p\n", p + 1);
int b[] = {1,2,3,4,5};
int c[][3] = {{1,2,3},{4,5,6}};
return 0;
}
輸出:
a = 0xffffef350420
&a = 0xffffef350420
p = 0xffffef350420
p+1 = 0xffffef350434
int (*p)[5] = &a;
p是指向一個含有5個元素的一維數組的指針類型。
p++,或者p+1,將指向"含有5個元素的一維數組a"之後的地址。
int a[5] = {1,2,3,4,5};
int *p = a; // 等價於int *p = a[0]; p是指向int類型的指針,p++,將指向數組的下一個元素2的地址。
int (*p)[5] = &a; // 一維數組指針p指向整個一維數組a。p++,將指向"含有5個元素的一維數組a"之後的地址。
所以,定義二維數組是,要指定第二維的長度:
若:
int c[][] = {{1,2,3},{4,5,6}};
將產生編譯錯誤:
c_pointer_type.c: In function ‘main’:
c_pointer_type.c:14:6: error: array type has incomplete element type
int c[][] = {{1,2,3},{4,5,6}};
^