2013-02-01 1 views
1

Possible en double:
How come an array’s address is equal to its value in C?C++: Lors de l'utilisation de memcpy, quelle est la différence entre myArray et & myArray?

Dans la situation:

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

Cette ligne ...

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

... est produire des résultats identiques à:

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

Je suis très novice en C++, mais j'avais l'impression que les tableaux sont juste un pointeur à leurs données. J'ai été choqué quand & myArray fonctionnait identique à myArray. J'aurais pensé que ce serait essayer de copier à l'ADRESSE du pointeur, ce qui serait très mauvais!

+2

[Les tableaux ne sont pas des pointeurs.] (Http://stackoverflow.com/questions/1641957/is-array-name- a-pointer-in-c) – Pubby

+0

@Pubby Donc myArray est identique à & myArray? Il n'y a pas de "prise"? – Jonathan

Répondre

3

Deux choses à propos des tableaux:

  • tableaux "désintégration" des pointeurs de leur type d'élément. C'est pourquoi la deuxième version fonctionne. Voir ceci: Is an array name a pointer?

  • Il existe un "pointeur vers un tableau". Ils sont rarement utilisés, mais ressemblent à ceci:


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

L'opérateur & lorsqu'il est utilisé sur un tableau vous donne un pointeur type de tableau, ce qui est la raison pour laquelle les éléments suivants ne fonctionne pas:

int* b = &a; // error 

Depuis paramètre de memcpy est un void* qui accepte tout type de pointeur, à la fois le travail et &myArraymyArray. Je vais recommander d'aller avec myArray bien que ce soit plus idiomatique.

1

Vous avez raison de croire que les types sont différents. &myArray est un unsigned char(*)[] (un pointeur vers un tableau de caractère non signé) et myArray (lorsqu'il est passé à une fonction en tant qu'argument) devient le type unsigned char* (pointeur vers un caractère non signé). Cependant, notez que même si les types sont différents, la valeur est la même adresse. La raison à la fois travailler avec memcpy est parce que memcpy prend void* et ne se soucie pas du type.

1

Quelle est la différence entre myArray et & myArray?

Ils pointent tous deux vers le premier élément de myArray.

Le nom d'un tableau évalue généralement à l'adresse du premier élément du tableau, donc myArray et & myArray ont la même valeur.La fonction prend l'adresse mémoire à la destination comme argument d'entrée.

memcpy Comme monTableau et & des points myArray au même endroit, de sorte que l'effort est le même:

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

Il y a une énorme différence, comme vous pouvez le voir si vous affichez sizeof (myArray) et sizeof (& myArray). – gnasher729

Questions connexes