Resumen del conocimiento de C que debe dominarse antes de aprender la estructura de datos (puntero 1)

Prefacio:

Debido a que el libro de estructura de datos es muy difícil de aprender para muchas personas, y la estructura de datos es realmente difícil, porque la estructura de datos requiere mucho conocimiento de C para poder aprender, en el cual los punteros y las estructuras están en la estructura de datos descrita en C El papel de es insustituible. Si no comprende estas cosas, es casi difícil avanzar en el libro de la estructura de datos, que está lleno de pseudocódigo, por lo que quiero resumir algunos de los conocimientos que necesita dominar antes de aprender la estructura de datos.

puntero

Puntero: La unidad variable requerida se puede encontrar a través de la dirección. Se puede decir que la dirección apunta a la unidad variable. Llamamos a la dirección visualmente como un puntero. (La dirección de una variable se denomina
puntero de la variable ) 1. Variable puntero :
Si hay una variable dedicada a almacenar la dirección de otra variable (es decir, puntero), se denomina variable puntero.
ejemplo:

int a = 19;
int* point_1;
point_1 = &a;
printf("%d,%d,%d,%d\n", a, &a,point_1,*point_1);

Inserte la descripción de la imagen aquí
En este programa simple, se pueden encontrar los resultados de estas cuatro variables, a = punto_1, & a = punto_1, esto se debe a que la dirección de la variable a se asigna a la variable de puntero point_1, por lo que si la variable de puntero se emite en forma de% d, El valor de es en realidad la dirección de la variable a. Cuando se apunta point_1, es point_1. Debido a que la variable de puntero es la dirección de a, el valor de * point_1 es en realidad el valor representado por a. Simplemente entienda, aquí la variable de puntero es la dirección y el puntero es el valor.

Entonces, si la variable de puntero no apunta a ninguna variable, ¿cuál será su valor?
Si lo ejecuta a través del programa, encontrará que no funciona, y el software de programación le indicará que la variable no está inicializada, pero de hecho, si no inicializa una variable, su valor es desconocido y aleatorio.

2. Cómo definir un
nombre de tipo de variable de puntero + * nombre de variable de puntero
como int * point_1
(Cabe señalar aquí que el nombre de tipo es int * en lugar de int, int * significa un puntero a una variable de número entero, int significa definir un número entero Variable de tipo, no es lo mismo, y point_1 es el nombre del tipo de puntero, y lo mismo es cierto para otros tipos, como el tipo de carácter)
3. Para la inicialización del puntero,
puede elegir definir primero una variable de puntero y luego asignarla, es decir, nosotros Se dice que apunte a una variable, también podemos asignarla directamente durante la definición,
como: int * point_1 = & a;
o
int * point_1;
point_1 = & a;
aquí llamamos int y otros tipos como tipos base No olvide cuando defina. El tipo base es diferente, lo que significa que el número de bytes representados en su memoria es diferente. Por ejemplo, los datos enteros son 4 bytes y el tipo de carácter es 1 byte. Cuando movemos el puntero, si el tipo base es En el caso del número entero, se mueven cuatro bytes a la vez (como se muestra en la figura) y el resto es el mismo;

int a = 19;
int* point_1;
point_1 = &a;
point_1++;
printf("%d,%d\n",  &a,point_1);

Inserte la descripción de la imagen aquí

(Cabe señalar aquí que no debe escribir * point_1 = & a; aquí está mal, porque sabemos que sus tipos son todos diferentes, ¿cómo se pueden asignar?)
4. La variable de puntero de referencia es
para la variable de puntero point_1 , Lo citamos de muchas formas
1. Cita directa:
por ejemplo, pirntf ("% d", punto_1);
también se puede citar en algunas asignaciones, como punto_1 = & a;
2. Cita indirecta
Por ejemplo:
al escribir una banda Cuando hay una función con un cuerpo de función, el puntero apunta a una determinada variable, y para el parámetro, ya sea un parámetro real o un parámetro formal, lo que se pasa es esencialmente un puntero, es decir, la dirección de la variable apuntada por el puntero. Lo llamamos dirección;
5.
Dado que una variable de puntero de matriz de puntero puede apuntar a una variable, también puede apuntar a una matriz. De hecho, cada elemento de la matriz tiene su dirección correspondiente, y la dirección representada por el nombre de la variable también se puede decir que está en la matriz La dirección representada por el primer elemento es en realidad la dirección de la matriz. Lo que llamamos puntero apunta a la matriz, lo que significa que el puntero apunta a la dirección del primer elemento de la matriz;

int a[4] = { 1,2,3,4 };
int* p;
p = &a[0];
printf("%d\n", *p);
p = a;
printf("%d\n", *p);

Inserte la descripción de la imagen aquí
Nota: La función de p = a; es asignar la dirección del primer elemento de la matriz a a la variable de puntero P, en lugar de asignar todas las direcciones de todos los elementos de la matriz ap;
también puede escribir int * directamente al definir la variable p = a;
6. Operaciones de puntero cuando se hace referencia a elementos de puntero Los
punteros son direcciones, las operaciones en punteros son esencialmente operaciones en direcciones;
por ejemplo, cuando p apunta a un [0], p + 1 significa un [1] (aquí Son aplicables la suma, resta, multiplicación, división, auto-suma y auto-decremento. Cuando se operan dos punteros, solo tiene sentido cuando apuntan a la misma matriz al mismo tiempo).
Nota: El nombre de la matriz es una constante de puntero y su valor se fija durante la ejecución del programa, por lo que no se puede realizar un ++.
7. Hacer referencia a elementos de matriz a través de punteros
(1) método de subíndice
(2) método de puntero
Los dos métodos siguientes se explican a través de un programa:

	int *p,i,a[10];
p = a;
for (i = 0; i < 10; i++)
	scanf_s("%d", p++);

for (i = 0; i < 10; i++, p++)
		printf("%d", *p);
	printf("\n");
for (p=a,i = 0; i < 10; i++, p++)
		printf("%d", *p);
	printf("\n");
for (i = 0; i < 10; i++)
		printf("%d", a[i]);
	printf("\n");
for (p = a, p<(a+10); p++)
	printf("%d,", *p);  

Inserte la descripción de la imagen aquí
Se puede ver en la imagen que la segunda línea de la salida da como resultado cosas desordenadas. De hecho, da como resultado 10 direcciones, porque cuando p se incrementa automáticamente, debido a que es un incremento automático en la dirección, después del ciclo, p en realidad apunta a Es el último elemento de la matriz, por lo que si a P no se le permite volver a apuntar, P se incrementa y es imposible predecir la dirección a la que apunta, porque excede el límite efectivo de la matriz;
8. Las operaciones de puntero
deben explicarse principalmente aquí. * p ++, * (p ++), * (++ p), ++ * p, * ++ p, ++ (* p) Algunas diferencias y similitudes, usemos un fragmento de código para ocultar estos resultados.

	int *p,i,a[10];
p = a;
for (i = 0; i < 10; i++)
	scanf_s("%d", p++); for (p = a, i = 0; i < 10; i++)
	printf("%d,", *p);       			printf("\n");
	for (p = a, i = 0; i < 10; i++)
		printf("%d,", *p++);			printf("\n");
	for (p = a, i = 0; i < 10; i++)
		printf("%d,", *(p++));			printf("\n");
	for (p = a, i = 0; i < 10; i++)
		printf("%d,", *(++p));			printf("\n");
	for (p = a, i = 0; i <10; i++)
		printf("%d,", ++ * p);			printf("\n");
	for (p = a, i = 0; i < 10; i++)
		printf("%d,", *++p);			printf("\n");
	for (p = a, i = 0; i < 10; i++)
		printf("%d,", ++(*p));

Inserte la descripción de la imagen aquí
Lo anterior es casi el resultado de diferentes operaciones en el puntero No debería ser difícil para los lectores ver las razones causadas por cada método de operación en comparación, así que no lo explicaré aquí.
Para los punteros, el conocimiento de los nombres de matrices como parámetros de función es extremadamente importante en la estructura de datos. La organización de estos puntos de conocimiento se organizará en el próximo artículo. No preguntes por qué, porque es demasiado tarde y me voy a dormir. Finalmente, espero que mi resumen sea correcto. Tu ayudaste.

Supongo que te gusta

Origin blog.csdn.net/weixin_47160672/article/details/108629971
Recomendado
Clasificación