陣列名稱與指標的關係
阿新 • • 發佈:2021-12-15
陣列名稱與指標的關係
初學指標的時候就知道了陣列名可以作為指標使用,但是並未對其深究。最近做測試有些與之有關的題目,引發了我對陣列名的更深思考,查資料之後有了更深理解,遂寫在這裡方便儲存。(參考CSDN LudyYuen)
探究
首先來看以下程式碼
#include<stdio.h>
int main()
{
int a[10];
int* p=a;
printf("%d\n", sizeof(a));
printf("%d", sizeof(p));
}
如果陣列名是指標,
則應該輸出 4 4(指標佔據空間記憶體大小)
實際結果輸出40 4.
所以陣列名不是指標
但是陣列名又有像指標的地方,上例*p=a將陣列名直接賦值於指標,表現的又像指標,再例如
#include<stdio.h>
#include<string.h>
int main()
{
char A[20] = "I love U";
char B[20];
strcpy(B, A);
printf("%s\n", A);
printf("%s", B);
return 0;
}
C庫函式中strcpy函式接納的是char型指標,但我們給予兩個陣列名依舊可以正常執行。
輸出為
I love U
I love U
陣列既有像指標的地方,但又不是指標,那麼陣列名與指標的關係究竟是什麼?
結論
1.陣列名的內涵在於其指代實體是一種資料結構,這種資料結構就是陣列;
2.陣列名的外延在於其可以轉換為指向其指代實體的指標,而且是一個指標常量;
3.指向陣列的指標則是另外一種變數型別(在WIN32平臺下,長度為4),僅僅意味著陣列的存放地址。
1.現在可以解釋為什麼第一組案例輸出的是40而不是4,原因為此時陣列名指代的是陣列的整體
2.陣列名可以當做指標常量
因為陣列名可以是指標常量,則其只代表一個指標且不可修改
#include<stdio.h>
int main()
{
int a[10] = { 1 };
int* p = a++;
printf("%d", *p);
}
如上,則會提示不可編譯,所以陣列名只是一個指標常量,不能修改。
3.資料名可能失去其資料結構內涵
看下面一段程式
#include<stdio.h>
void ceshi(int str[])
{
printf("%d", sizeof(str));
}
int main()
{
int a[10] = { 1 };
ceshi(a);
}
如果陣列名代表的是陣列整個結構,並且根據第一例,理應輸出40,但是這個程式卻輸出4,儼然是一個指標的記憶體大小。
這是因為在函式內,陣列名作為形參失去了其內涵,僅僅是一個指標
失去了內涵,那麼它同樣可以被修改。