Un análisis en profundidad del puntero "Cinco"

Hoy hablo principalmente sobre matrices de punteros y conocimiento sobre punteros de matriz.

 

¡Espero que todos se diviertan hoy también!

 

contenido

matriz de punteros:

¿Qué tal un poco avanzado?

Extensión:

¿Son los números en la matriz parte del tipo? (10 en int[10])

 Entonces, ¿qué pasa con el reenvío forzoso de la dirección?

Próximo aviso:


matriz de punteros:

El primero es una matriz.Los elementos de la matriz son punteros, y el número de bytes ocupados por la matriz está determinado por el tamaño de la propia matriz. ,

Las matrices pueden contener cualquier tipo (enteros, flotantes, estructuras, campos de bits, punteros, matrices, etc.)

Puntero de matriz:

El primero es un puntero, que apunta a una matriz, que tiene 4 bytes por debajo de 32 bits, y se desconoce el número de bytes de la matriz apuntada.

Un puntero puede apuntar a cualquier variable de tipo legal.

    int *p1[10] ;
	int(*p2)[10] ;

Analiza el ejemplo anterior:

Primero [ ] tiene mayor precedencia que * Entonces, p1 primero combinado con [ ] es una matriz, y luego el tipo es el tipo int * de la matriz.

p2 se combina primero con * para convertirse en un puntero, apuntando a una matriz, el tipo de matriz es int [10].

¿Qué tal un poco avanzado?

    int(*p3[7])[10];
	int(*(*p4)[8])[10];

Esto parece un poco complicado, pero la esencia no ha cambiado, analicemos:

En primer lugar, primero se combina p3 con la matriz, es una matriz, luego se debe colocar el contenido, el tipo es int (*) [10], este tipo es una matriz de punteros, por lo que esta es una matriz de matriz punteros , el número de elementos de la matriz es 7, el tipo de elemento de la matriz es int (*) [10].

p4 se combina primero con el puntero, es un puntero, el puntero debe tener un puntero, apunta a una matriz, la matriz almacena un puntero de matriz, por lo que este es un puntero a una matriz puntero matriz , el puntero primero apunta a una matriz puntero, y el contenido del puntero de matriz es una matriz.

Aquí puede anidar muñecas de forma inalámbrica, pero en general, este paso no se utilizará, siempre que pueda entenderlo.

Extensión:

Hay un lugar extraño en el lenguaje C, normalmente, una variable es tipo + nombre de variable = valor . El entero, el punto flotante y el puntero están todos satisfechos, ¡pero ponerlo en una matriz es diferente ! 

Vea un ejemplo:

    int a = 10;
	double b = 11.1;
	int * c = NULL;
	double *d = NULL;
	int arr[10] = { 0 };
	double brr[10] = { 0 };

Los tipos generales están a la izquierda, mientras que las matrices son diferentes, pero todas satisfacen el tipo eliminando el nombre de la variable.

Entonces, si queremos que el tipo de la matriz sea el mismo que los demás, usamos typedef para cambiar el nombre del tipo.

 Esto tiene sentido, pero el uso de typedef es una especie de encapsulamiento, y no se recomienda usarlo en exceso .

¿Son los números en la matriz parte del tipo? (10 en int[10])

 

De esta manera, mediante depuración, el número [ ] en el arreglo es parte del tipo, y se coloca en b sin previo aviso después de &a, lo que prueba que el tipo de &a es el mismo que el de la variable apuntadora b, si los números son diferentes, puedes ponerlo en b entrar?

Puedes ponerlo, pero hay una advertencia.

 

 Esto está relacionado con otro punto de conocimiento, sobre la conversión coercitiva de direcciones.

Coerción: solo cambia la forma en que se ven los datos, no el tipo de datos.

Por ejemplo, si la cadena "12345" se convierte en el número entero 12345, no se puede lograr mediante conversión forzada, entonces los datos han cambiado. En, por ejemplo, int a = 97, desea representarlo como el carácter 'a', luego solo necesita mirar los datos de tipo char, sin cambiar la matriz en sí.

 

 Entonces, ¿qué pasa con el reenvío forzoso de la dirección?

De hecho, el valor de la dirección no cambia , solo cambia el número de bytes a los que se accede, o está relacionado con el tamaño del paso de acceso después de forzar el puntero.

 

 

Próximo aviso:

El próximo número explicará el conocimiento de los arreglos bidimensionales.

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

 

Supongo que te gusta

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