[El alma del lenguaje C] - puntero (2)

contenido

operaciones de puntero

puntero + - entero

puntero - puntero

Implementar la función strlen con el método puntero-puntero

punteros y matrices

puntero secundario

matriz de punteros

puntero de matriz


operaciones de puntero

puntero + - entero

Puntero + - Número entero es cuántos bytes deben omitirse al acceder a la memoria. Se ha introducido antes, por lo que no hablaré de eso aquí.

puntero (1)

puntero - puntero

Esto es muy común en matrices, puntero-puntero representa el número de elementos entre dos punteros

Así, dirección baja - dirección alta, se volverá negativa.

Implementar la función strlen con el método puntero-puntero

#include <stdio.h>
#include <assert.h>
 
int my_strlen(const char* str)
{
	assert(str);//判断指针是否错误
	char* tmp = str;
	while (*++tmp)
	{
		;
	}
	return tmp - str;
}

También escribí la implementación de muchas funciones de biblioteca, puede echar un vistazo cuando tenga tiempo:    Implementación de varias funciones de biblioteca

punteros y matrices

Se puede ver en la depuración: el nombre de la matriz y la dirección del primer elemento de la matriz son los mismos,
por lo tanto: el nombre de la matriz representa la dirección del primer elemento de la matriz.

Excepto 2 casos

1.sizeof(arr) El nombre de la matriz en este momento representa la matriz completa, es decir, el nombre de la matriz colocado solo en sizeof representa la matriz completa

2. &arr Este es el nombre de la matriz que también representa la matriz completa, y se quita la dirección de la matriz completa.

 Dado que el nombre de la matriz se puede almacenar en un puntero como una dirección, usamos el puntero para acceder a cada elemento de la matriz.

int main()
{
	int arr[] = { 0,1,2,3,4 };
	int* p = arr; 
	int sz = sizeof(arr) / sizeof(arr[0]);
	int i = 0;
	for (i = 0; i < sz; i++)
	{
		printf("&arr[%d] = %p\n", i, &arr[i]);
		printf("p+%d = %p\n", i, p + i);
	}
	return 0;
}

 resultado de la operación:

 Así que p+i en realidad está accediendo a la dirección del subíndice i de la matriz arr, y podemos acceder al contenido de la matriz desreferenciandola.

Entonces podemos acceder a la matriz directamente a través del puntero.

int main()
{
	int arr[] = { 0,1,2,3,4 };
	int* p = arr; 
	int sz = sizeof(arr) / sizeof(arr[0]);
	int i = 0;
	for (i = 0; i < sz; i++)
	{
		printf("%d ", *(p + i));
	}
	return 0;
}

De hecho, cuando accedemos al arreglo arr[i] , el compilador lo convertirá en *(arr+i) , por lo que el acceso al puntero es el mismo que el acceso al arreglo,

puntero secundario

La variable puntero también tiene su propia dirección, ¿podemos guardar la dirección del puntero? Sí. Este es el puntero secundario.

Si guarda la dirección del puntero de segundo nivel, se convierte en un puntero de tercer nivel (y cuarto nivel, quinto nivel... se pueden anidar infinitamente)

La dirección de a se almacena en pa, y la dirección de pa se almacena en ppa.

pa es un puntero de primer nivel, ppa es un puntero de segundo nivel.

*ppa elimina la referencia de la dirección en ppa para encontrar pa, y *ppa realmente accede a pa.

Al desreferenciar la dirección en pa encontrará un ; también puede **ppa . Esto también le permitirá acceder a un .

matriz de punteros

Una matriz de punteros es una matriz de variables de puntero .

Los elementos de la matriz pueden ser enteros, tipos de coma flotante, tipos de caracteres... Los punteros también son un tipo y también se pueden almacenar en una matriz.Esta es una matriz de tipos de punteros (denominada matriz de punteros).

int main()
{
	int a = 10;
	int b = 20;
	int c = 30;
	int d = 40;
	int e = 50;
	int* arr[5] = { &a,&b,&c,&d,&e };//存放整型指针的数组
	for (int i = 0; i < 5; i++)
	{
		printf("%d ", *(arr[i]));//依次对数组中的指针进行访问
	}
	return 0;
}

 

puntero de matriz

Un puntero de matriz es un puntero que almacena la dirección de toda la matriz .

Como dijimos anteriormente, diferentes tipos de variables de puntero acceden a diferentes tamaños de memoria al mismo tiempo y, a veces, necesitamos acceder a toda la matriz.

Es necesario utilizar un puntero de matriz.Si la matriz es para almacenar números enteros, entonces el tipo de puntero de matriz es int(*)[ ].

Supongo que te gusta

Origin blog.csdn.net/qq_54880517/article/details/123910225
Recomendado
Clasificación