c++ - que - punteros y vectores en c
¿Es el nombre de la matriz un puntero constante en C++? (2)
Tengo una pregunta sobre el nombre de la matriz a
int a[10]
¿Cómo se define el nombre de la matriz en C ++? ¿Un puntero constante? ¿Se define de esta manera o simplemente podemos verlo así? ¿Qué operaciones se pueden aplicar sobre el nombre?
El estándar de C ++ define qué es una matriz y su comportamiento. Eche un vistazo en el índice. No es un puntero, constante o de otro tipo, y no es otra cosa, 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.
Claramente, 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" a un puntero a su propio primer elemento. Puedes pensar en esto como una conversión automática. El resultado es un valor de r, lo que significa que es "solo" un valor de puntero, y no se puede asignar, como cuando un nombre de función decae a un puntero de función. No significa que sea "const" como tal, pero no es asignable.
Así que una matriz "es" un puntero muy parecido a una función "es" un puntero a una función, o una larga "es" un int. Es decir, en realidad no lo es, pero puedes usarlo como tal en la mayoría de los contextos gracias a la conversión.
Un nombre de matriz no es un puntero constante; sin embargo, actúa como uno en muchos contextos (se convierte en uno a la vista) que para la mayoría de los propósitos es.
Desde 6.3.2.1/3 "Otros operandos / valores de L, matrices y designadores de funciones":
Excepto cuando es el operando del operador
sizeof
o el operador unario&
, o si se utiliza un literal de cadena 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 de matriz y no es un lvalue.