對於理解不同,我們需要了解兩種不同上下文。
- 在值上下文,
T
類型的數組的名稱是相當於一個指針鍵入T
,並等於一個指針數組的第一個元素。
- 在對象上下文中,類型爲
T
的數組的名稱不會減少爲指針。
什麼是對象上下文?
在a = b;
,a
處於對象上下文中。當你獲取一個變量的地址時,它用在對象上下文中。最後,在變量上使用sizeof
運算符時,它在對象上下文中使用。在所有其他情況下,在值上下文中使用一個變量。
現在,我們有這方面的知識,當我們這樣做:
void f(int arr[4]);
這是正是相當於
void f(int *arr);
當你發現了,我們可以省略(以上4)大小來自函數聲明。這意味着你無法知道傳遞給f()
的「數組」的大小。後來,當你這樣做:
int a[]={1,2,3,4};
f(a);
在函數調用,這個名字a
是在價值方面,所以它減少的指針int
。這很好,因爲f
需要一個指向int
的指針,所以函數定義和使用匹配。傳遞給f()
的是指向a
(&a[0]
)的第一個元素的指針。
在
int a[]={1,2,3,4};
int b[4] = a;
名稱b
的情況下在一個對象上下文中使用,並且不降低到指針。 (順便說一下,這裏a
處於值上下文,並減少了一個指針。)
現在,int b[4];
分配的4個int
S吸留值得並給出了名稱b
給它。 a
也被分配了類似的存儲空間。所以,實際上,上述分配意味着「我想使存儲位置與先前的位置相同」。這沒有意義。
如果你想副本的a
內容爲b
,那麼你可以做:
#include <string.h>
int b[4];
memcpy(b, a, sizeof b);
或者,如果你想要一個指針b
是指向a
:
int *b = a;
這裏,a
在值上下文中,並且減少到指向int
的指針,所以我們可以將a
分配給一個int *
。
最後,初始化數組時,可以分配給它明確的價值觀:
int a[] = {1, 2, 3, 4};
這裏,有4個元素,初始化爲1,2,3和4。你也可以做:
int a[4] = {1, 2, 3, 4};
如果在列表中比陣列中元件的數量較少的元素,則這些值的其餘部分被取爲0:
int a[4] = {1, 2};
套a[2]
和a[3]
爲0
問題的標題需要重寫,當前的標題是過於通用和小寫。 – 2010-01-10 04:34:47