C 指針 數組指針類型,用數組名給指針賦值,編譯warning: initialization from incompatible pointer type

參考[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}};
      ^

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章