He examinado algunos recursos para decirme cómo ->
y .
son diferentes, pero parecen hacer lo mismo. ¿->
actúa como un operador de punto en una estructura?¿Cómo funcionan los "->" y "." las operaciones de acceso a miembros difieren en C
Respuesta
.
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
.
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
->
es un puntero a struct lo .
es una estructura.
struct Data data;
data.content = 1;
struct Data* pData = &data;
pData->content = 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);
}
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;
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;
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.
[.] 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.
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.
'->' 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
Muestra lo que sé sobre "C". El "*" era un tipo-o. Gracias. –
- 1. optimización del acceso a los miembros en C++
- 2. Acceso a los miembros privados de PowerShell
- 3. Acceso a miembros agregados subclasificados
- 4. Acceso a los miembros protegidos de subclases: gcc vs msvc
- 5. preprocesadores C y orden de las operaciones
- 6. ¿Cómo funcionan los archivos de encabezado y fuente en C?
- 7. ¿Cómo funcionan las banderas en C?
- 8. hmac_sha256 en PHP y C# difieren
- 9. ¿Cómo funcionan los eventos virtuales en C#?
- 10. Acceso a los miembros internos de la clase anónima
- 11. ¿Cómo funcionan los índices en las vistas?
- 12. ¿Cómo funcionan los métodos asíncronos en C#?
- 13. ¿Cómo funcionan los enchufes en C?
- 14. ¿Cómo funcionan los métodos virtuales en C#?
- 15. Cómo funcionan los genéricos en C++/CX
- 16. acceso a los datos privados de los miembros de la clase externa en la clase interna
- 17. Cómo generalizar el acceso a DbSet <TEntity> miembros de un DbContext?
- 18. C++ 0x función <>, enlace y miembros
- 19. ¿Por qué <C-PageUp> y <C-PageDown> no funcionan en vim?
- 20. Modificadores de acceso en miembros de la interfaz en C#
- 21. Herencia y acceso a la amistad. C++
- 22. ¿Cómo funcionan los operadores de C++
- 23. C# ThreadStatic + miembros volátiles que no funcionan como se esperaba
- 24. ¿Cómo y cuándo están dispuestos los miembros estáticos C#?
- 25. Acceso directo para navegar por los miembros en Visual Studio
- 26. Definición de los miembros estáticos en C++
- 27. Niveles de acceso de los miembros de la clase java
- 28. ¿Por qué Java y C# difieren en Ups?
- 29. Acceder a los miembros en una estructura de C++ de forma dinámica y estática
- 30. ¿Cómo funcionan los greenlets?
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