2010-08-06 7 views

Respuesta

17

. se utiliza cuando tiene una estructura, y -> se utiliza cuando se tiene un puntero a una estructura. La flecha es una forma abreviada para desreferenciar el puntero y luego usar .: p->field es lo mismo que (*p).field.

+6

Vale la pena mencionar que esto es realmente bueno cuando tienes punteros a ** otras ** estructuras en una estructura. Entonces tienes 'a-> b-> c-> d' en lugar de' (* ((* ((* a) .b)). C)). D'. – detly

2

que estés utilizando un punto cuando se accede a los miembros del objeto, y la flecha -> cuando se accede a los miembros a través del puntero a un objeto

2

-> es un puntero a struct lo . es una estructura.

struct Data data; 
data.content = 1; 

struct Data* pData = &data; 
pData->content = 2; 
2

Ah, acabo de encontrar la misma pregunta, cuando se mira la configuración regional. Uno es para acceder a los atributos a través del puntero y una es para la estructura sin referencia:

#include <locale.h> 

int main (void) { 

    struct lconv *locale_ptr; 
    locale_ptr = localeconv(); 
    printf("Currency symbol: %s\n", (*locale_ptr).currency_symbol); 
} 

es equivalente a:

int main (void) { 

    struct lconv *locale_ptr; 
    locale_ptr = localeconv(); 
    printf("Currency symbol: %s\n", locale_ptr->currency_symbol); 
} 
7

Ellos son casi la misma cosa. La única diferencia es que "->" toma un puntero a una estructura en el lado izquierdo mientras que "." toma una estructura; "->" deferencias (es decir, sigue) el puntero antes de acceder al miembro de estructura. Así,

struct foo bar; 
bar.x = 0; 

es lo mismo que:

struct foo bar; 
struct foo *diddly = &bar; 
diddly->x = 0; 
1

más simple que utiliza. cuando se opera en una Struct misma y -> cuando se opera en un puntero a una estructura.

que mostrar en código:

struct s myStruct; 
    myStruct.num = 5; 

es válido, pero:

struct s myStruct; 
    myStruct->num = 5; 

no es válido como myStruct no es un puntero.

struct s *myStruct; 
    myStruct->num = 5; 

Sería válido.

El operador -> es en realidad una abreviatura de (* myStruct) .num;

1

El lenguaje C, a diferencia de muchos otros idiomas, permite que las variables tengan objetos (aquí se estructura) como valores y también apunta a los objetos como valores. Dependiendo del tipo de variable que se use, "." o "->" tienen que ser utilizados respectivamente.

1

[.] opera en un objeto de una estructura. Una vez que se declara un objeto de una estructura particular, el operador [.] Se puede usar para operar directamente con los miembros.

[->] funciona sobre un puntero al objeto de una estructura. Este es un operador de desreferencia que se usa exclusivamente con punteros a objetos con miembros. De este modo, nos permite acceder a los miembros del objeto al que tenemos referencia.

Según la declaración, puede utilizar estos operadores.

0

El operador a-> b, canónicamente, significa (* a) .b. Entonces, a diferencia de ".", Desreferenciará su primer argumento.

Podría estar equivocado en este punto, pero entiendo que no es "oficialmente" parte de C (específicamente menciona C en la pregunta). Es una construcción C++ que la mayoría de los vendedores de compiladores de C han agregado a C. Sin embargo, debo admitir que no me he mantenido actualizado con los cambios a C, así que podría estar completamente equivocado allí.

En C++ existen otras diferencias. El operador "->" es sobrecargable, donde como "." no es.

+4

'->' estuvo en la primera edición de K & R, por lo que ha sido parte de C durante la mayor parte de su vida y, desde luego, antes de que C++ tuviera un brillo en el ojo de Bjarne Soustrup. También 'a-> b' es azúcar sintáctica para' (* a) .b'. En tu ejemplo, los paréntesis estaban en el lugar equivocado. – JeremyP

+0

Muestra lo que sé sobre "C". El "*" era un tipo-o. Gracias. –

Cuestiones relacionadas