學習指針數組時遇到過的一個問題定義char *p5[5]={'1','2','3','4','5'};,出現警告warning: initialization makes pointer from

在學習小甲魚帶你學C帶你飛課程中的指針數組與數組指針章節時,小甲魚舉了指針數組的兩個例子。

我們先瞭解到:指針數組其實就是一個數組,每個數組元素存放的是一個指針變量。

定義一個指針數組 int *p[5],這個數組的長度是5,類型是整形指針,定義 int *p,可以理解成數組的長度爲1,哈哈。所以指針數組,你就把它看成是由一個個指針組成的數組就可以了。

小甲魚舉的兩個例子代碼如下

int main()
{
         int a=1;
         int b=2;
         int c=3;
         int d=4;
         int e=5;

         int *p[5]={&a,&b,&c,&d,&e};

         int i;

         for(i=0;i<5;i++)
         {
                printf("%d\n",*p[i]);

         }
         char *p1[5]={"讓變成該比世界","coanima","狗比","你不佩","草泥馬"};
          for(i=0;i<5;i++)
         {
                printf("%s\n",p1[i]);

         }
         return 0;
}

運行結果如下: 

1
2
3
4
5
讓變成該比世界
coanima
狗比
你不佩
草泥馬

這一段代碼是確定沒有問題的 ,後來我想如果這樣初始化指針數組會怎麼樣,

          int  *p3[5]={1,2,3,4,5};
          for(i=0;i<5;i++)
         {
                printf("%d\n",p3[i]);
         }

         char  *p5[5]={'1','2','3','4','5'};
          for(i=0;i<5;i++)
         {
                printf("%c\n",p5[i]);
         }

結果出現下列警告; 

test23.c:29:16: warning: initialization makes pointer from integer without a cast [-Wint-conversion]
   int  *p3[5]={1,2,3,4,5};
                ^
test23.c:29:16: note: (near initialization for ‘p3[0]’)
test23.c:29:18: warning: initialization makes pointer from integer without a cast [-Wint-conversion]
   int  *p3[5]={1,2,3,4,5};


test23.c:32:26: warning: format ‘%d’ expects argument of type ‘int’, but argument 2 has type ‘int *’ [-Wformat=]
                 printf("%d\n",p3[i]);

什麼意思呢?

警告:存在一個整數賦值給指針變量的問題,我們知道賦值給指針的應該是地址,而不是一個整數

我的理解,定義指針時 如 int *p,是指*p的類型是一個整形;char *p 是指*p的類型是字符型,需要知道的是這兩種定義下p資深都是一個地址,是一個整形。我們在定義指針時 ,不能這樣定義:int *p=1;或者char *p='1';所以我們在定義指針數組時也不能使用int  *p3[5]={1,2,3,4,5};這樣的定義。

有人可能會疑惑爲什麼char *p1[5]={"讓變成該比世界","coanima","狗比","你不佩","草泥馬"};這樣的定義就沒錯呢。那是因爲

char *p="字符串"這樣的定義沒有問題。

         char *p4 = "週六";
         printf("p4=%s",p4);

結果爲:p4=週六,個人理解,字符串就像一個數組,所以可以這樣用

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