[Lenguaje C] punteros elementales, súper detallados, incluidos ejemplos de código

agregar descripción del enlace


prefacio

Hola amigos, el autor de este artículo resume súper detalladamente los conocimientos básicos de pointers que ha aprendido. El puntero es un punto de conocimiento muy importante en el proceso de aprendizaje del lenguaje C. También es la esencia del lenguaje C. ¡Aprendamos más sobre los punteros juntos! !


1. ¿Qué es exactamente un puntero?

  1. Un puntero es el número de la unidad más pequeña en la memoria, es decir, la dirección

  2. El puntero en el idioma hablado generalmente se refiere a la variable de puntero, que es una variable utilizada para almacenar la dirección de memoria.

  3. Resumen: un puntero es una dirección, y un puntero en el lenguaje hablado generalmente se refiere a una variable de puntero

  4. En una máquina de 32 bits, la dirección es una secuencia binaria compuesta de 32 0 o 1, y la dirección debe almacenarse en 4 bytes, por lo que el tamaño de una variable de puntero debe ser de 4 bytes.
    Entonces, si en una máquina de 64 bits, si hay 64 líneas de dirección, el tamaño de una variable de puntero es de 8 bytes para almacenar una dirección

5. Resumen:
los punteros se utilizan para almacenar direcciones y las direcciones identifican de forma única un espacio de direcciones.
El tamaño del puntero es de 4 bytes en plataformas de 32 bits y de 8 bytes en plataformas de 64 bits.

2. Varios tipos de información de puntero

1. Punteros y tipos de punteros

Todos sabemos que las variables tienen diferentes tipos, enteros, coma flotante, etc. ¿El puntero tiene un tipo?
Para ser precisos: sí.
Por favor, vea el código a continuación:

int num = 10;
p = #

Para guardar &num (la dirección de num) en p, sabemos que p es una variable de puntero, entonces, ¿cuál es su tipo?
Ahora necesitamos darle a la variable puntero el tipo correspondiente.

char  *pc = NULL;
int   *pi = NULL;
short *ps = NULL;
long  *pl = NULL;
float *pf = NULL;
double *pd = NULL;

Aquí podemos saber:
El puntero de tipo char* es para almacenar la dirección de la variable de tipo char.
El puntero de tipo short* se utiliza para almacenar la dirección de la variable de tipo short.
El puntero de tipo int* se utiliza para almacenar la dirección de la variable de tipo int.
¡Etcétera!


2. puntero ± entero

Los punteros también pueden realizar varias operaciones, consulte:

#include <stdio.h>
int main()
{
    
    
 int n = 10;
 char *pc = (char*)&n;
 int *pi = &n;
 
 printf("%p\n", &n);
 printf("%p\n", pc);
 printf("%p\n", pc+1);
 printf("%p\n", pi);
 printf("%p\n", pi+1);
 return  0;
}

Resumen: El tipo de puntero determina cuánto (distancia) el puntero da un paso hacia adelante o hacia atrás.

3. Desreferenciar punteros

Después de guardar la dirección de la variable con un puntero, debemos usar el operador de desreferencia '*' para operar en la variable correspondiente a la dirección guardada. Consulte el siguiente
código:

#include <stdio.h>
int main()
{
    
    
 int n = 0x11223344;
 char *pc = (char *)&n;
 int *pi = &n;
 *pc = 0;   //Pi是char*类型的指针变量,所以它可以操作1个字节的内存空间
 *pi = 0;   //Pi是int*类型的指针变量,所以它可以操作4个字节的内存空间
 return 0;
}

Resumen:
el tipo de puntero determina cuánta autoridad (cuántos bytes se pueden manipular) al eliminar la referencia del puntero.
Por ejemplo: quitar la referencia a un puntero char* solo puede acceder a un byte, mientras que quitar la referencia a un puntero int* puede acceder a cuatro bytes.

4. Puntero salvaje

Un puntero salvaje significa que la ubicación señalada por el puntero es desconocida (aleatoria, incorrecta y sin restricciones claras),
no podemos operar sobre el puntero salvaje, porque el derecho de usar el espacio al que apunta no está en nuestras manos, y el ¡la operación forzada informará un error o Dañino a la computadora!

Causas de punteros salvajes:

  1. El puntero no está inicializado y la variable de puntero local no está inicializada para ser un valor aleatorio
  2. Acceso fuera de los límites del puntero, esta situación ocurre principalmente en matrices (cuando el rango al que apunta el puntero excede el rango de la matriz arr, p es un puntero salvaje)
  3. El espacio apuntado por el puntero se libera, y el espacio apuntado se ha liberado, pero si operamos con fuerza en la dirección, causará una excepción de puntero salvaje.

Cómo evitar los punteros salvajes:
4. Inicialización del puntero
5. Tenga cuidado con el puntero fuera de los límites
6. Liberación del espacio del puntero del puntero incluso si es NULL
7. Evite devolver la dirección de las variables locales
8. Verifique la validez del puntero antes de usarlo

5. Operación de puntero puntero-puntero

Debemos ser claros: el resultado de restar punteros de punteros es: el número de elementos (espacios) que difieren entre los espacios señalados por estos dos punteros (tomar el valor absoluto si la resta es negativa), esto debemos tenerlo claro Por ejemplo, consulte el
siguiente código:

int main()
{
    
    
	int arr[10] = {
    
     1,2,3,4,5,6,7,8,9,10 };
	int len = &arr[9] - &arr[0];
	printf("%d\n", len);
	return 0;
}

El resultado de la operación es el siguiente:
inserte la descripción de la imagen aquí
la dirección del décimo elemento menos la dirección del primer elemento es el número de elementos que difieren entre ellos, ¡que es 9! ! !

6. La relación de comparación entre punteros y punteros

El estándar estipula que
se permite comparar un puntero a un elemento de matriz con un puntero a la ubicación de memoria después del último elemento de la matriz, pero no se permite compararlo con un puntero a la ubicación de memoria antes del primer elemento.

7. Puntero secundario

Una variable de puntero también es una variable, y una variable tiene una dirección.¿Dónde se almacena la dirección de la variable de puntero? Este es el ejemplo
del puntero secundario :

int main()
{
    
    
	int a=10;//普通整型变量
	int* p = &a;//一级整型指针
	int** pp = &p;//二级整型指针
	printf("%d\n", *(*pp));//10
	return 0;

}

Del mismo modo, hay punteros de tres niveles, de cuatro niveles, etc.

Resumir

Estos son los punteros básicos compartidos y resumidos hoy. El blogger actualizará un artículo detallado sobre punteros avanzados más adelante y llevará a cabo un análisis y una comprensión más profundos de los punteros. Si te gusta, puedes prestar atención al seguimiento. . ¡Gracias por ver! ! !

Supongo que te gusta

Origin blog.csdn.net/m0_71214261/article/details/132164962
Recomendado
Clasificación