¿Qué significan los punteros en C?
Los punteros siempre han sido muy populares en el lenguaje C/C; es casi imposible encontrar una aplicación C/C que no utilice punteros. Se utiliza para almacenar direcciones de datos y programas, que es la función básica de los punteros. Para apuntar a un número entero, use un puntero de entero (int*); para apuntar a un número de punto flotante, use un puntero de punto flotante (float*) para apuntar a una estructura, use el puntero de estructura correspondiente (struct xxx *); para apuntar a cualquier dirección, utilice un puntero sin escribir (void*).
A veces, necesitamos algunas indicaciones generales. En lenguaje C, (void*) puede representar todo, pero en C también tenemos algunos punteros especiales que no pueden ser representados por (void*). De hecho, en C, encontrar un puntero universal, especialmente un puntero de función universal, es simplemente una "tarea imposible".
C es un lenguaje de tipado estático y la seguridad de tipos juega un papel importante en C. En lenguaje C, puedes usar void* para apuntar a todo; pero en C, void* no puede apuntar a todo. Incluso si pudiera, pierde el significado de seguridad de tipos. La seguridad de tipos a menudo puede ayudarnos a encontrar errores potenciales en el programa.
Analicemos cómo se almacenan los punteros a varios tipos de datos en C.
Discusión sobre punteros C (1) Blog de Mu Feng sobre punteros de datos
1. Puntero de datos
Los punteros de datos se dividen en dos tipos: punteros de datos normales y datos de miembros Punteros
1.1 Punteros de datos regulares
Esto no necesita explicación Al igual que el lenguaje C, la definición y la asignación son muy simples y claras. Los más comunes son: int*, double*, etc.
Por ejemplo:
int value = 123;
int * pn = amp
1.2 Puntero de datos de miembro
p >Tiene la siguiente estructura:
struct MyStruct
{
int key
int value
>};
Ahora hay un objeto de estructura:
MyStruct me
MyStruct* pMe = amp; p> Necesitamos la dirección del miembro de valor, podemos:
int * pValue = amp;
// o
int *; pValue = amp; pMe-gt; value;
Por supuesto, este puntero todavía pertenece a la primera categoría: puntero de datos normal.
Bien, ahora necesitamos un puntero que apunte a cualquier miembro de datos en MyStruct, entonces debería ser así:
int MyStruct:: * pMV = amp ;MyStruct::value ;
//o
int MyStruct::* pMK = amp;MyStruct::key;
El propósito de este puntero es Se utiliza para obtener la dirección de un miembro de la estructura dentro de la estructura. Podemos acceder a los datos del miembro a través de este puntero:
int value = pMe-gt; *pMV // Obtener el valor de los datos del miembro de pMe.
int key = me.*pMK; // Obtenga mis datos de miembro clave.
Entonces, ¿bajo qué circunstancias se utilizarán los punteros de datos de los miembros?
De hecho, los punteros de miembros no son un puntero de uso muy común. Sin embargo, aún puede resultar útil en determinados momentos. Primero echemos un vistazo a la siguiente función:
int sum(MyStruct* objs, int MyStruct::* pm, int count)
{
int resultado = 0;
for(int i = 0; i lt; count; i)
resultado = objs[i].*pm
return; resultado;
}
¿Cuál es la función de esta función? ¿Puedes entenderla? Su función es calcular la suma de los datos de los miembros dados, dados los punteros de recuento a la estructura MyStruct. Un poco difícil de pronunciar, ¿verdad? Echa un vistazo al siguiente programa, quizás lo entiendas:
MyStruct me[10] =
{
{1, 2}, {3, 4 }, {5, 6}, {7, 8}, {9, 10}, {11, 12}, {13, 14}, {15, 16}, {17, 18}, {19, 20}
};
int sum_value = sum(me, amp;MyStruct::value, 10);
//Calcula los miembros de valor de 10 estructuras MyStruct Suma : el valor sum_value es 110 (2 4 6 8 20)
int sum_key = sum(me, amp;MyStruct::key, 10);
//Calcula 10 MyStructs La suma de los miembros clave de la estructura: el valor sum_key es 100 (1 3 5 7 19)
Quizás pienses que también se puede hacer con un puntero normal y es más fácil de entender. Ok, no hay problema:
int sum(MyStruct* objs, int count)
{
int result = 0
for; (int i = 0; i lt; count; i)
resultado = objs[i].value
devolver resultado
}