2013-02-01 70 views
1

可能重複:
How come an array’s address is equal to its value in C?C++:使用memcpy時,myArray和&myArray有什麼區別?

的情況:

int x = 5; 
unsigned char myArray[sizeof (int)]; 

這條線......

memcpy (&myArray , &x , sizeof (int)); 

...是產生相同的結果:

memcpy (myArray , &x , sizeof (int)); 

我是C++的新手,但我的印象是數組只是指向他們的數據的指針。當我的數組與myArray工作相同時,我感到震驚。我本以爲它會試圖複製到指針的地址,這將是非常糟糕的!

+2

[數組不是指針。(http://stackoverflow.com/questions/1641957/is-array-name- a-pointer-in-c) – Pubby

+0

@Pubby所以myArray和&myArray是一樣的嗎?沒有'catch'? – Jonathan

回答

3

兩件事情:

  • 陣列 「衰變」 其元件類型的指針。這就是爲什麼第二個版本正在工作。看到這個:Is an array name a pointer?

  • 有這樣的事情,「指針數組」。他們很少使用,但像這樣:


int a[5]; 
int (*b)[5] = &a; // pointer to an array of 5 ints 

陣列上使用時,&運營商給你一個指針數組類型,這就是爲什麼下面不工作:

int* b = &a; // error 

由於memcpy的參數是一個void*,它接受任何指針類型,既&myArraymyArray工作。我會推薦使用myArray,因爲它比較習慣。

1

你相信類型是不同的。 &myArrayunsigned char(*)[](指向無符號字符數組的指針)和myArray(當傳遞給函數作爲參數時)變爲unsigned char*(指向無符號字符的指針)。但是,請注意,即使類型不同,值也是相同的地址。這兩個工作與memcpy的原因是因爲memcpy需要void*並不關心類型。關於陣列

1

myArray和& myArray有什麼區別?

它們都指向myArray的第一個元素。

數組的名稱通常計算爲數組的第一個元素的地址,因此myArray和myArray的值相同。

memcpy函數將內存地址作爲輸入參數。作爲myarray,並將& myArray的指向同一個地方,這樣的努力是一樣的:

void* memcpy(void* dest, const void* src, std::size_t count); 

Parameters 
dest -  pointer to the memory location to copy to 
src -  pointer to the memory location to copy from 
count -  number of bytes to copy 
+0

有一個巨大的差異,你可以看到如果你顯示sizeof(myArray)和sizeof(&myArray)。 – gnasher729

相關問題