Notas de estudio de Lengua C (Introducción 3) (Puntero)

Que es un puntero

A continuación, se incluye un ejemplo para ilustrar el poder de los punteros.

#include<stdio.h>
void main(){
    
    
	const int a=3;
	//这里定义一个const int 变量a 其作用就是锁定a的值使之不可变.
	//比如此时再让a=4就会报错
	a=4;

}

Inserte la descripción de la imagen aquí
Entonces, en este momento, si desea cambiar forzosamente el valor de a, debe usar un puntero.

#include<stdio.h>
void main(){
    
    
	const int a=3;
	int* prt;//创建一个指向int的指针
	//这里定义一个const int 变量a 其作用就是锁定a的值使之不可变.
	//比如此时再让a=4就会报错
	prt=&a;//取地址
	*prt=4;//提取所储存地址内的对应的值并修改为4
	printf("a=%d",a);

}

Los resultados son los siguientes:
Inserte la descripción de la imagen aquí

Diagrama de memoria

Para una mejor comprensión, podemos dibujar el siguiente diagrama de demostración;
Inserte la descripción de la imagen aquí
tomemos un ejemplo para ver:

#include<stdio.h>
void main(){
    
    
	int a=3;
	int* prt;
	prt=&a;
	printf("a的值为%d\na的地址为%p\nprt存放的值为%p\nprt的内存地址为%p\nprt所存的地址对应的值为%d",a,&a,prt,&prt,*prt);

}

Inserte la descripción de la imagen aquí

Tipo de puntero

No hay nada que decir al respecto. Hay varias estructuras de datos y puede haber varios punteros. Porque un puntero es solo una herramienta que apunta a la dirección de una determinada variable. La ventaja de esto es que puede establecer el alcance sin crear una nueva variable. La influencia de modifica directamente una variable o toma un valor, siempre que la variable exista y el espacio de memoria no se destruya.

int a ----> int * aprt
float b -----> float * b
char c -------> char * c
int arr [100] -----> int * arrprt [100 ] // 数组

Tamaño del puntero

Lo que almacena el puntero es una dirección de memoria hexadecimal, que es esencialmente un valor que se puede sumar y restar para comparar.
Antes de explicarlo, simplemente introduzca el concepto de una matriz de enteros. El nombre de la
matriz de
matriz de enteros es solo para usar El material para almacenar un conjunto de datos, para decirlo sin rodeos, es una lista. Es solo que los enteros almacenados en esta lista de enteros en el lenguaje C son todos enteros.

#include<stdio.h>
void main(){
    
    
	int* listprt[5];
	int list[5];//也可以这样定义不指明大小 list[]
	// 可以这样赋值 list[5]={1,2,3,4,5}也可以像下面一样
	int i;
	for(i=0;i<5;i++){
    
    
		list[i]=i;
		listprt[i]=&list[i];
	}//赋值
	
}

Para una matriz, su distribución de memoria es la siguiente:
Inserte la descripción de la imagen aquí

Entonces, cuando queremos mostrar el valor de la matriz, podemos hacer esto

#include<stdio.h>
void main(){
    
    
	int* x;
	int* listprt[5];
	int list[5];//也可以这样定义不指明大小 list[]
	// 可以这样赋值 list[5]={1,2,3,4,5}也可以像下面一样
	int i,j;
	x=&list;
	printf("list的内存地址%p,list的第一个元素的地址%p",x,listprt[0]);
	for(i=0;i<5;i++){
    
    
		list[i]=i;
		listprt[i]=&list[i];
	}//赋值
	for(j=0;j<5;j++){
    
    
		printf("list[i]=%d",*listprt[i]);
	}
	
	
}

También puede ser así

	
#include<stdio.h>
void main(){
    
    
	int* listprt[5];
	int list[5];//也可以这样定义不指明大小 list[]
	// 可以这样赋值 list[5]={1,2,3,4,5}也可以像下面一样
	int i,j;
	
	
	for(i=0;i<5;i++){
    
    
		list[i]=i;
		listprt[i]=&list[i];
	}//赋值
	printf("%p,%p\n",&list,listprt[0]);//补充前面说的
	for(j=0;j<5;j++){
    
    
		printf("list[i]=%d\n",*(listprt[0]+j));
	}

}

Aquí el puntero más uno o menos uno se refiere a restar varias unidades de memoria. Tome el ejemplo anterior, suponiendo que int ocupa dos bytes, p es un puntero. Entonces, si p es 0x11111, entonces p ++ es p + 2 bytes y el resultado es 0x11113 De la misma manera, sume 2, es decir, p + = 2 y p es 0x11115

Puntero secundario

Para decirlo sin rodeos, es una muñeca anidada.
Solo mira un fragmento de código a continuación;

void main(){
    
    
	int a=4;
	int* p=&a;
	int**mp=&p;//二级指针,三级指针就是 int*** 
	printf("a=%d\np的地址为:%p\np指向的值为:%d,mp的地址是:%p,指向的是%p\na的地址是%p",a,&p,*p,&mp,*mp,&a);
}

Los resultados son los siguientes: El
Inserte la descripción de la imagen aquí
diagrama esquemático de la memoria es el siguiente:
Inserte la descripción de la imagen aquí
Entonces, combinado con esta figura, los tres niveles y cuatro punteros son iguales. Muñecos infinitos.
Además, los punteros también pueden apuntar a funciones, que son punteros de función.
Hablaré de esto en la siguiente sección.

Supongo que te gusta

Origin blog.csdn.net/FUTEROX/article/details/109476733
Recomendado
Clasificación