2014-06-13 23 views
1

的memcpy的爲什麼說兩者memcpy低於產生相同的結果:使用AddressOf用2個陣列

int arr1[5] = {some_data1}; 
int arr2[5] = {some_data2}; 

memcpy(&arr1, &arr2, (5 * sizeof(int))); 
memcpy(arr1, arr2, (5 * sizeof(int))); 

爲什麼沒有在第一的memcpy參見ARR1和ARR2雙指針?是否因爲數組名稱不是真正的指針而是「數組」類型變量的標識符?

+1

可能的重複[數組的地址等於它在C中的值?](http://stackoverflow.com/questions/2528318/how-come-an-arrays-address-是等於它的值在C) – Barmar

+2

(offtopic:傳遞'5'因爲在memcpy中的大小是錯誤的) – Arkadiy

回答

1

因爲在C,當a是一個數組,我們有這樣的:

(void *) a == (void *) &a 

&a的(指向數組)和&a[0](指針指向數組的第一元素)中的地址是相同的,只有類型不同。

0

this question的重複 - 「數組的名稱通常計算爲數組的第一個元素的地址,因此array和&數組具有相同的值。」

+2

如果它是重複的,使用_flag_按鈕,不要發佈一個答案,只是指向另一個問題。 – Barmar

+0

@jarmod謝謝,我發佈之前沒有找到這個問題。道歉。 –

0

在某些情況下,當您使用數組名稱時,它將轉換爲數組的地址。將數組作爲函數參數傳遞是這些上下文之一。但使用帶有&運算符的數組不是 - 它返回數組的地址。

3

爲什麼第一個memcpy看不到arr1arr2的雙指針?

說白了,因爲它不是雙指針。

是因爲數組名稱不是真正的指針而是「數組」類型的變量的標識符?

絕對!發生這種情況的原因恰恰是因爲數組是而不是指針,儘管這兩種C對象共享了許多令人誤解的相似性。

行爲是相同的,因爲這兩個表達式在傳遞到memcpy時產生數字相同的void*指針。

+0

謝謝。更新我的問題。討厭的僞代碼,我很抱歉。 –

0

在數組中,你的數組變量(arr1 amd arr2)自然代表數組的基地址,你不需要給&(operator的地址)。 arr1 == & arr1