2010-02-28 5 views

Respuesta

27

El estándar C++ define qué es una matriz y su comportamiento. Eche un vistazo en el índice. No es un puntero, const o no, y no es nada más, es una matriz.

Para ver una diferencia:

int a[10]; 
int *const b = a; 

std::cout << sizeof(a); // prints "40" on my machine. 
std::cout << sizeof(b); // prints "4" on my machine. 

Es evidente que A y B no son del mismo tipo, ya que tienen diferentes tamaños.

En la mayoría de los contextos, un nombre de matriz "decae" en un puntero a su primer elemento. Puedes pensar en esto como una conversión automática. El resultado es un valor r, lo que significa que es "solo" un valor de puntero y no se puede asignar a, de forma similar a cuando un nombre de función decae en un puntero de función. No significa que sea "const" como tal, pero no es asignable.

Entonces una matriz "es" un puntero muy parecido a una función "es" un puntero a la función, o un largo "es" un int. Es decir, no es realmente así, pero puede usarlo como uno solo en la mayoría de los contextos gracias a la conversión.

+0

realmente insight! Gracias ! – lovespring

+0

* a estaría imprimiendo el valor del primer elemento en la matriz y, por lo tanto, se suponía que apuntaba a la dirección de memoria del primer elemento de la matriz. Entonces, ¿por qué el operador sizeof da el tamaño de todos los elementos de la matriz a en lugar de dar el tamaño de solo almacenar la dirección de memoria del primer elemento de la matriz? – user1825567

+1

@ user1825567: porque la expresión '* a' tiene una conversión implícita (llamada" decaimiento "), del tipo de matriz al tipo de puntero. Podría pensarlo como una abreviatura de '* pointer_to_first_element_of (a)'. Entonces debería ser bastante obvio por qué 'sizeof (a)' no necesita ser igual que 'sizeof (pointer_to_first_element_of (a))'. 'a' no es un puntero. Cualquiera que le diga que no entiende C o no lo respeta lo suficiente como para pensar que usted entiende C. –

6

Un nombre de matriz no es un puntero constante; sin embargo, actúa como uno en tantos contextos (se convierte prácticamente en uno) que para la mayoría de los propósitos.

De 6.3.2.1/3 "Otros operandos/Lvalues, matrices y designadores de función":

Excepto cuando es el operando del operador o la sizeof unario & operador, o es una cadena literal utilizado para inicializar una matriz, una expresión que tiene el tipo "matriz de tipo" se convierte en una expresión con el tipo "puntero a tipo" que apunta al elemento inicial del objeto matriz y no es un valor l.

+3

Quiero señalar que esta es una cita del estándar C. En C++, la matriz no se descompone independientemente. Tiene en cuenta el contexto, por ejemplo: 'int a [10]; int (& r) [10] = a;/* sin caries * /; '. –

Cuestiones relacionadas