2012-04-02 8 views
6

Es la única manera de conseguir la dirección de una dirección en C (frente a la doble eliminar la referencia a tener una variable intermediadirección C de una dirección de una variable

por ejemplo, he:?

int a; 
int b; 
int *ptr_a; 
int *ptr_b; 
int **ptr_ptr_a; 

a = 1; 
ptr_a = &a; 
ptr_ptr_a = &(&a); <- compiler says no 
ptr_ptr_a = &&a;  <- still compiler says no 
ptr__ptr_a = &ptr_a; <- ok but needs intermediate variable 

pero se puede hacer a la inversa, por ejemplo

b = **ptr_ptr_a;  <- no intermediate variable required 

por ejemplo, no tengo que hacer:

ptr_b = *ptr_ptr_b; 
b = *ptr_b; 

¿Por qué los dos operadores no son simétricos en su funcionalidad?

+1

Porque el puntero debe apuntar a algo de memoria. entonces, 'ptr_a = & a' significa que ptr_a apunta a a. pero, '&& a' -> no hay un 'puntero' al que apunte el puntero. ptr_a es algo de memoria en la pila, por lo que puede señalarlo. – nothrow

+0

No hay ninguna razón para complicar las cosas: 'int * ptr_ptr_a = &ptr_a;' está bien. – karlphillip

+0

por supuesto - tiene sentido después de haberlo señalado - muchas gracias – bph

Respuesta

11

El operador de dirección devuelve un valor r, y no se puede tomar la dirección de un valor r (ver here para una explicación de las diferencias entre rvalues ​​y lvalues).

Por lo tanto, debe convertirlo en un lvalue almacenándolo en una variable, luego puede tomar la dirección de esa variable.

+2

Bueno, eso es correcto, pero si el OP está haciendo esta pregunta, es probable que RValues ​​sea un concepto bastante avanzado ... – Roddy

+0

@Roddy, cierto, agregué un enlace al artículo de MSDN que explica estos conceptos. –

1

dirección de la dirección de algo que no es posible, porque una dirección de domicilio sería ambigua

Puede obtener la dirección de algo que mantenga la dirección de algo, y usted podría tener múltiples ocurrencias de que (con diferente valores)

1

No existe la dirección de una dirección. Usted tiene una caja, con un número en ella. Ese es el número de la caja en la secuencia de memoria. No hay lugar que almacene estos números. Esto también sería extremadamente recursivo como puedes ver.

1

Si piensa por un momento, notará que para obtener la dirección de algo, debe estar en la memoria.

Si tiene una variable

int a 

tiene una dirección. Pero esta dirección es, en caso de duda, en ningún lugar de la memoria, por lo que no necesita una dirección. IOW, solo puede obtener la dirección de una variable.

En la otra dirección, las cosas son más fáciles. Si tiene la dirección de algo, puede desreferenciarlo. Y si este "algo" es un puntero, puede desreferenciarlo de nuevo. Entonces, la indirección doble mencionada arriba se da automáticamente.

1

En pocas palabras, solo las cosas almacenadas físicamente en la memoria de las computadoras pueden tener una dirección. Solo pedir la dirección de algo no significa que la dirección se almacena en la memoria.

Cuando tiene un puntero intermedio, ahora lo está almacenando en la memoria y tomando la dirección de donde está almacenado.

3

Cuando solicita una dirección usando '&', le pide a la dirección algo almacenado en la memoria. Usando '&' 2 veces significa que desea obtener la dirección de una dirección que no tiene sentido.

Por cierto, si usa una variable intermedia mientras lo hace, obtendrá la dirección de la variable intermedia. Lo que significa que si usas 2 variables intermedias para comparar direcciones, serán diferentes. por ej.:

int a = 0; 
int* p = &a; 
int* q = &a; 

// for now &p and &q are different 

if (&p == &q) 
    printf("Anormal situation"); 
else 
    print("Ok"); 
+0

Esta respuesta es dudosa, '" plop "' no es una variable, pero '&" plop "' es válida. – ouah

4

Es probablemente más fácil de explicar con un ejemplo de disposición de memoria de esta manera:

Var  Adr value 
--------------------- 
a   1000  1 
ptr_a  1004 1000 
ptr_ptr_a 1008 1004 
               1008  1004  1008->1004->1000 
You can obviously dereference ptr_ptr_a twice *ptr_ptr == ptr_a, **ptr_ptr_a == 1 

Pero la variable a tiene una dirección (1000) lo que se debe abordar de una dirección significa si no es la dirección de un puntero? &a es una estación final. Por lo tanto, &&a no tendría ningún sentido.

Cuestiones relacionadas