1. 程式人生 > 其它 >陣列名稱與指標的關係

陣列名稱與指標的關係

陣列名稱與指標的關係

初學指標的時候就知道了陣列名可以作為指標使用,但是並未對其深究。最近做測試有些與之有關的題目,引發了我對陣列名的更深思考,查資料之後有了更深理解,遂寫在這裡方便儲存。(參考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,儼然是一個指標的記憶體大小。

這是因為在函式內,陣列名作為形參失去了其內涵,僅僅是一個指標

失去了內涵,那麼它同樣可以被修改。