在學習小甲魚帶你學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=週六,個人理解,字符串就像一個數組,所以可以這樣用