2011-12-07 19 views
17
int t[10]; 

int * u = t; 

cout << t << " " << &t << endl; 

cout << u << " " << &u << endl; 

de salida:Dirección de la matriz

0045FB88 0045FB88 
0045FB88 0045FB7C 

La salida para u tiene sentido.

Entiendo que t y &t[0] deben tener el mismo valor, pero ¿cómo es que &t también es el mismo? ¿Qué significa realmente &?

+4

¤ La única diferencia entre 't' convertida en puntero, y' & t', es el tipo de puntero. El referente de este último es formalmente del tipo de matriz, por lo que sumarle 1 lo mueve bastante (a la siguiente matriz de ese tipo en la memoria).Mientras que el referente del primero es del tipo de elemento. Terminología: en el grupo de Usenet [comp.lang.C++] hubo cierta controversia sobre si se puede decir que un puntero como su 'u'" apunta "a la matriz, ya que su referente no es del tipo de matriz. Eso se resolvió en innumerables ocasiones al señalar el uso del estándar de dicha redacción. Cheers & hth., –

+0

@alf ¿no fue ese chico paul curioseando con esa pregunta? –

+0

@ JohannesSchaub-litb: sí –

Respuesta

18

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 se utiliza t como argumento del operador &, no se produce tal conversión. El & 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.

+0

¡Gracias! Supongo que fue la conversión implícita de matriz a puntero lo que me dio la mentalidad equivocada de 'u' ser un puntero. – quuxbazer

+0

@quuxbazer: 'u'_es_ un puntero. 't' _is_ una matriz. 'int * u = t' aplica una conversión de matriz a puntaje a' t', e inicializa 'u' con el resultado. – Mankarse

+0

-1 Esta es una descripción incorrecta para C++ –

0

t es la dirección de la matriz, &t es todavía un puntero a la matriz, por lo tanto, la dirección que se muestra es idéntica.

Una buena referencia que he encontrado es cplusplus forum que explica muy bien este concepto.

Como se ha dicho allí sobre &array:

Es una de las excepciones en las que la regla no se aplica. Lo toma como un puntero a la matriz. Volverá a señalar el primer elemento de la matriz, pero si agrega uno a este puntero, apuntará a la dirección del lugar justo después del último elemento de la matriz (al igual que omitió la matriz).

+1

-1 "& t es una referencia a la primera dirección de la matriz" es incorrecta –

+0

@ AlfP.Steinbach ¿Cómo? & t es una referencia al comienzo del bloque de memoria utilizado por la matriz, por lo tanto, una referencia a la primera dirección de la matriz, a menos que esté mezclando mis significados cambiando la redacción? – Serdalis

+0

'& t' no es una referencia. es un valor de puntero. tenga en cuenta que * puede * tener una referencia a una matriz, pero '& t' no es eso. –

-2

No hay ninguna variable llamada t, ya que no puede 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 en el caso de funciones:

int foo(void) 
{ 
    return 12; 
} 

printf("%p and %p\n", (void *) foo, (void *) &foo); 

Esto debe imprimir la misma cosa, ya que no hay ninguna variable que contiene la dirección de foo, cuya dirección a su vez se pueden tomar.

+1

Es C++, y hay una variable llamada 't'. Puede pasarlo a la función que acepta el argumento con tipo 'int (&) [10]'. – Abyx

+3

-1 "No hay una variable llamada t, ya que no puedes cambiarla". Es incorrecto. Un objeto que se nombra en una declaración se llama una variable. Ve a buscar el estándar. –

3

El tipo real de t es , por lo que &t es la dirección de la matriz.
También, int[] convierte implícitamente a int*, por lo tconvierte para abordar de array el primer elemento del array.

+2

No, convierte a la dirección del primer elemento. Las ubicaciones de memoria absoluta son las mismas, pero los tipos son bastante diferentes. –

+0

@BenVoigt, sí, gracias. – Abyx

Cuestiones relacionadas