2013-02-20 1 views
2

Quelqu'un pourrait-il m'expliquer ce petit fragment de code?C++ static_cast <void *>

Étant donné:

int a[3] = {2,3,4}; 

Pourquoi ce qui suit être évaluée à true?

static_cast<void *>(a) == static_cast<void *>(&a); // Why is this true? 

Est-ce à dire que le address of a est le même que a? Si oui, pourquoi est-ce vrai?

+0

Il semble probablement étrange si vous êtes nouveau en C/C++. C'est en fait une convention de C: elle ne s'applique qu'aux tableaux littéraux (et je pense que les noms de fonction/pointeurs) – kfmfe04

Répondre

3

C'est parce que l'adresse de la variable a concorde avec l'adresse du premier élément du tableau a. Vous pouvez également penser à a&a[0] qui est plus clair quand on dit "l'adresse du premier élément du tableau").

Un autre exemple,

struct X 
{ 
    int i; 
}; 

X x; 

Ici aussi l'adresse de la variable x concides avec l'adresse de x.i (qui est le premier élément de l'ensemble), donc ce imprimerait 1:

std::cout << (&x == &(x.i)) << std::endl; //1 

Donc dans votre cas, &a est comme &x, et a (ou &a[0]) est comme &(x.i).

Notez que dans C++ a et x sont tous les deux ensemble appelé (voir ma réponse ici: What is an aggregate?)

+0

Hmm, donc je comprends que 'a == & a [0]' fait exactement cela. Dans ce cas, je pensais que nous étions de-refrencing (est ce terme correct?) à la 0ème position dans le tableau 'a', et ensuite prendre l'adresse de cette position, qui est ce qui est pointé par' a' en premier lieu. Mais dans le cas de l'article original, je pensais que nous comparerions 'a', qui est un pointeur qui stocke une adresse au premier élément du tableau, à l'adresse de ce pointeur' a'. Est-ce que cela signifie sur la pile qu'il n'y a pas de variable locale réelle 'a' qui pointe vers un tableau de la pile? – tdashroy

+0

(suite) Comment ce tableau est-il géré sur la pile? Peut-être que cela aidera à le rendre plus clair pour moi. – tdashroy

+0

@tdashroy: Il existe une variable locale réelle 'a', qui n'est que le début du tableau. L'espace de pile occupé par 'a' est égal à' sizeof (a) 'octets, ce qui est identique à' sizeof (ElementType) * ElementCount'. – Nawaz

0

Le nom d'un tableau évalue généralement à l'adresse du premier élément du tableau, si tableau et & tableau avoir exactement la même valeur.

Cependant, ils sont de types différents. Pour le tableau suivant:

int a[8]; 

a + 1 est l'adresse du tableau a + sizeof (int) mais & a + 1 sera l'adresse du tableau a + 8 * sizeof (int).

1

Dans presque tous les contextes, le nom d'un tableau se désintègre en un pointeur vers le premier élément du tableau. Ainsi, dans static_cast<void*>(a), le a se désintègre en &a[0]; son type est "pointeur sur int". L'expression évalue à l'adresse du premier élément du tableau. En static_cast<void*>(&a), cependant, &a est l'adresse du tableau lui-même; son type est "pointeur sur tableau de 3 int". C'est pourquoi les moulages sont nécessaires ici: les deux expressions sans moulage auraient des types différents, et ne pourraient pas être comparés. Les deux peuvent être convertis en void* et comparés. Donc, ce que ce code illustre est que l'adresse du premier élément d'un tableau est la même que l'adresse du tableau, , c'est-à-dire, il n'y a pas de remplissage à l'avant.

Questions connexes