Dirección del array

int t[10]; int * u = t; cout << t << " " << &t << endl; cout << u << " " << &u << endl; 

salida:

 0045FB88 0045FB88 0045FB88 0045FB7C 

La salida para u tiene sentido.

Entiendo que t y &t[0] deberían tener el mismo valor, pero ¿por qué &t también es el mismo? ¿Qué significa & t en realidad?

Cuando t se usa solo en la expresión, se produce una conversión de matriz a puntero, esto produce un puntero al primer elemento de la matriz.

Cuando t se usa como el argumento del operador & , no ocurre tal conversión. El & luego toma explícitamente la dirección de t (la matriz). &t es un puntero a la matriz como un todo.

El primer elemento de la matriz está en la misma posición en la memoria que el inicio de toda la matriz, por lo que estos dos punteros tienen el mismo valor.

El tipo real de t es int[10] , así que &t es la dirección de la matriz.
Además, int[] convierte implícitamente a int* , por lo que t convierte a la dirección de la matriz el primer elemento de la matriz.

No hay una variable llamada t , ya que no puedes cambiarla. El nombre t simplemente se refiere a la dirección del primer elemento (y también tiene un tamaño asociado). Por lo tanto, tomar la dirección de la dirección realmente no tiene sentido, y C “colapsa” para que solo sea la dirección.

El mismo tipo de cosas sucede para el caso de las funciones:

 int foo(void) { return 12; } printf("%p and %p\n", (void *) foo, (void *) &foo); 

Esto debería imprimir lo mismo, ya que no hay una variable que contenga la dirección de foo , cuya dirección a su vez puede tomarse.