3 回答

TA貢獻(xiàn)1860條經(jīng)驗(yàn) 獲得超8個贊
為了理解差異,我們需要了解兩種不同的情況。
在值上下文中,type數(shù)組的名稱T等效于type 的指針T,并且等于指向數(shù)組第一個元素的指針。
在對象上下文中,類型數(shù)組的名稱T不簡化為指針。
什么是對象上下文?
在中a = b;,a是在對象上下文中。當(dāng)您獲取變量的地址時,將在對象上下文中使用它。最后,當(dāng)sizeof在變量上使用運(yùn)算符時,將在對象上下文中使用它。在所有其他情況下,在值上下文中使用變量。
現(xiàn)在我們有了這些知識,當(dāng)我們這樣做時:
void f(int arr[4]);
它正好相當(dāng)于
void f(int *arr);
如您所知,我們可以從函數(shù)聲明中忽略大?。ㄉ厦鏋?)。這意味著您無法知道傳遞給的“數(shù)組”的大小f()。稍后,當(dāng)您這樣做時:
int a[]={1,2,3,4};
f(a);
在函數(shù)調(diào)用中,名稱a位于值上下文中,因此將其簡化為的指針int。這很好,因?yàn)閒需要指向的指針int,所以函數(shù)定義并使用match。傳遞給的f()是指向a(&a[0])第一個元素的指針。
如果是
int a[]={1,2,3,4};
int b[4] = a;
該名稱b在對象上下文中使用,并且不會簡化為指針。(順便說一下,a這里是在值上下文中,并簡化為指針。)
現(xiàn)在,int b[4];分配4 ints的存儲時間并為其命名b。 a還被分配了類似的存儲空間。因此,實(shí)際上,上述分配表示“我要使存儲位置與先前的位置相同”。這沒有道理。
如果要將內(nèi)容復(fù)制a到中b,則可以執(zhí)行以下操作:
#include <string.h>
int b[4];
memcpy(b, a, sizeof b);
或者,如果你想要一個指針b是指向a:
int *b = a;
在這里,它a是在value上下文中,并簡化為的指針int,因此我們可以分配a給int *。
最后,在初始化數(shù)組時,您可以為其分配顯式值:
int a[] = {1, 2, 3, 4};
在這里,a有4個元素,分別初始化為1、2、3和4。您也可以這樣做:
int a[4] = {1, 2, 3, 4};
如果列表中的元素?cái)?shù)少于數(shù)組中的元素?cái)?shù),則其余值將取為0:
int a[4] = {1, 2};
將a[2]和設(shè)置a[3]為0。

TA貢獻(xiàn)1852條經(jīng)驗(yàn) 獲得超7個贊
void f(int arr[]);
void f(int arr[4]);
語法具有誤導(dǎo)性。它們都與此相同:
void f(int *arr);
即,您正在傳遞一個指向數(shù)組開頭的指針。您不復(fù)制陣列。
- 3 回答
- 0 關(guān)注
- 425 瀏覽
添加回答
舉報(bào)