Análisis de profundidad de puntero "cuatro" (la relación "íntima" entre punteros y matrices)

Hoy hablaremos principalmente de la íntima relación entre punteros y arrays ¿Cuáles son las similitudes y diferencias entre ellos?

 

¡Que la pasen bien todos hoy!

 

 

¿Están relacionados los punteros y las matrices?

Todo el mundo sabe que las matrices y los punteros son similares en términos de acceso, ¿existe una relación entre ellos? Déjame decirte.

Defina una cadena como un puntero y acceda a ella

Primero, definimos una cadena con un puntero y accedemos a ella de dos maneras (acceso de puntero y acceso [])

	const char *p = "holle boy";
	int len = strlen(p);

	printf("指针形式访问\n");
    for (int i = 0; i < len; i++)
	{
		printf("%c ", *(p + i));
	}

	printf("\n数组形式访问\n");
	for (int i = 0; i < len; i++)
	{
		printf("%c ", p[i]);
	}

 

Se puede ver que p puede usar cualquier método de acceso, ¿significa esto que los punteros están relacionados con las matrices? (no estoy seguro por ahora)

Además, digamos p, esta cadena abierta está en el área de constantes de caracteres en la memoria, incluso si no hay const, el valor interno no se puede modificar, porque esta es la protección a nivel del sistema operativo. La dirección de la variable de puntero p se almacena en el marco de la pila de la función principal, y el punto de p es la primera dirección de la cadena creada en el área de constantes de caracteres, un boceto para su referencia.

 

Defina una cadena como una matriz y acceda a ella

Luego defina una cadena en forma de matriz y acceda a él.

    char q []= "holle girl";
	int len = strlen(q);

	printf("指针形式访问\n");
	for (int i = 0; i < len; i++)
	{
		printf("%c ", *(q + i));
	}

	printf("\n数组形式访问\n");
	for (int i = 0; i < len; i++)
	{
		printf("%c ", q[i]);
	}

 Esto es creado por la matriz y se accede de dos formas. Parece que también se puede acceder a las matrices en forma de punteros, entonces, ¿cuál es la relación entre los punteros y las matrices? (Todavía no estoy seguro)

Compara la diferencia entre los dos

Primero hablemos de un pequeño ejemplo. Si hay tu gemelo en este mundo, su forma corporal y apariencia son las mismas que las tuyas, e incluso el trabajo y el descanso son los mismos que los tuyos. ¿ Tu hermano es exactamente igual a ti?

En primer lugar, pueden tener muchas similitudes, incluso el mismo trabajo y descanso, pero en esencia, son dos personalidades completamente diferentes, por lo que son completamente desiguales.

Los punteros y las matrices son como gemelos, son similares, pero no podemos confundirlos conceptual o esencialmente.

Tome el ejemplo anterior para analizar:

Este es el almacenamiento de la matriz, que es el espacio abierto en el área de la pila.Todos los elementos de la cadena están en la pila, y el valor se puede modificar.

Se puede acceder a ambos en forma de punteros y matrices.

 

 

 Este es el espacio abierto para el almacenamiento en forma de puntero.La dirección de p se almacena en el área de la pila y el contenido de la cadena se almacena en el área de caracteres constantes. Y el valor no se puede modificar.

De esta manera, desde la perspectiva del almacenamiento de cadenas , los punteros y las matrices no tienen nada que ver entre sí, pero tienen muchas similitudes en términos de métodos de acceso .

Conclusión: los punteros y las matrices no tienen nada que hacer 

El problema de reducción de dimensionalidad de los parámetros de matriz

En primer lugar, debemos saber que cuando la matriz se pasa a través de una llamada de función, su dimensión se reducirá y se reducirá a un puntero.

Vea un ejemplo:

void Show(int arr[] /*int* arr*/, int num)
{
	for (int i = 0; i < num; i++)
	{
		printf("%d ", arr[i]);
	}
	printf("\n");
}

int main()
{
	int a[5] = { 1, 2, 3, 4, 5 };
	int num = sizeof(a) / sizeof(a[0]);

	Show(a, num);

	return 0;
}

En primer lugar, esto es para imprimir los elementos de la matriz en la pantalla, luego habrá notado que no hay un parámetro de función int arr[] e int *arr puede imprimir el resultado . ¿por qué? ¿ Y por qué el puntero de int * puede recibirlo ?

El resultado se puede ver mediante la depuración:

 Se puede ver que el tipo de arr es int*, lo que significa que arr pasa la dirección del primer elemento , y el puntero de int* se usa para recibir sin previo aviso.

Esto se denomina reducción de la dimensionalidad de los parámetros de matriz.

Entonces, ¿por qué la reducción de la dimensionalidad?

En pocas palabras, es por la eficiencia de las llamadas a funciones para reducir la dimensión en punteros , en lugar de copiar la matriz, solo copie el puntero (4 bytes)

Entonces, ¿qué es la reducción de dimensionalidad?

En pocas palabras, es la reducción de la dimensionalidad en un puntero al tipo de elemento interno . (La explicación posterior de los punteros complejos se discutirá en detalle)

¿Por qué se debe acceder a los punteros y matrices de la misma manera?

Como se mencionó anteriormente, la reducción de la dimensión de la matriz se reduce a punteros, por lo que si los métodos de acceso de los punteros y las matrices son diferentes, ocurrirá la siguiente situación.

void Show(int arr[], int num)
{
	printf("指针形式 ");
	for (int i = 0; i < num; i++)
	{
		printf("%d ", *(arr+i));
	}
	printf("\n");
}

int main()
{
	int a[5] = { 1, 2, 3, 4, 5 };
	int num = sizeof(a) / sizeof(a[0]);

	Show(a, num);

	printf("数组形式打印");
	for (int i = 0; i < num; i++)
	{
		printf("%d ", a[i]);
	}
	printf("\n");
	Show(a, num);

	return 0;
}

Esto conducirá al uso de la forma de puntero cada vez que se usa la matriz para pasar parámetros, y la forma de matriz debe usarse para acceder a la matriz, lo cual es muy problemático.Si hay un error, obviamente no es adecuado para el uso. escenario, por lo que en el diseño final, el uso de matrices y punteros será común.

Resumen de este problema:

En primer lugar, hablamos de la diferencia de almacenamiento entre punteros y matrices, que no tiene nada que ver con distinguir en profundidad punteros y matrices .

Luego hablamos sobre la reducción de la dimensionalidad de los arreglos, para allanar el camino de por qué los métodos de acceso de los arreglos y los punteros son los mismos.

Entonces dijimos, porque si los métodos de acceso de los punteros y las matrices son diferentes, generará inconvenientes para los usuarios en algunos casos especiales y aumentará la probabilidad de errores, por lo que se accede a ellos de la misma manera.

Próximo aviso:

El próximo número explicará el conocimiento de punteros complejos.

¡El próximo número será más emocionante~! ~! ~!

Supongo que te gusta

Origin blog.csdn.net/m0_64770095/article/details/124215950
Recomendado
Clasificación