Puntero en lenguaje C (reproducir en minutos)

Que es un puntero

Para decirlo sin rodeos, el puntero se usa para almacenar la dirección de una variable
como se muestra en la figura:
Inserte la descripción de la imagen aquí

(El editor es vc2010)

#include<stdio.h>
void main(){
    
    
	int a,*p;
	a=5;
	p=&a;
	printf("a=%d,p=%p,*p=",a,p,*p);
	getchar();

}

Entonces, a través de la situación de este momento, encontramos que no solo podemos obtener el valor de una variable a través del puntero, sino también modificar directamente el valor de la variable.

Otro ejemplo es el siguiente:

#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);
	getchar();

}

Puntero de matriz

Hablando de punteros, ¿cuál es el significado de básico int char float? El siguiente es un puntero de matriz para
combinar la matriz y el puntero. Por supuesto, el puntero pasa la matriz en sí misma cuando se pasa.
La siguiente es una demostración de código

#include<stdio.h>
void main(){
    
    
	int a [5]={
    
    1,2,3,4,5},*p,i;
	p = a;
	for(i=0;i<5;i++){
    
    
		printf("&a[%d]=%p,a[%d]=%d\n",i,p,i,p[i]);
	
	}
	getchar();

}

Inserte la descripción de la imagen aquí

Descubrimos que cuando p = a (puntero a la matriz a), el puntero p se puede operar como la matriz a, que es una matriz de punteros.

Puntero de matriz

Ahora que estamos hablando de matrices de punteros, tenemos que hablar de punteros de matriz. A primera vista, los dos nombres son muy similares, pero de hecho la brecha sigue siendo muy grande.
Int * p []
Lo siguiente sigue tomando el ejemplo anterior como ejemplo, hacemos que los resultados de salida sean consistentes

#include<stdio.h>
void main(){
    
    
	int a [5]={
    
    1,2,3,4,5},*p[5],i;
	for(i=0;i<5;i++){
    
    
		p[i]=&a[i];
	}
	for(i=0;i<5;i++){
    
    
		printf("&a[%d]=%p,a[%d]=%d\n",i,p[i],i,*p[i]);
	
	}
	getchar();


}

Descubrimos que esto es en realidad una matriz de direcciones de almacenamiento. Esta dirección de memoria puede ser int char o float y también una matriz. Hablaremos de esto después de que terminemos de hablar sobre la matriz de cadenas.

Matriz de cadenas

No hay una clase de cadena (java) ni str (python) en lenguaje C. Solo hay caracteres, así que introdujimos una matriz de cadenas para almacenar cadenas.
('A' un byte "a" dos bytes)
Preste atención aquí El caso es que una matriz de cadenas como char a [5] = "hola", en la superficie solo hay cinco caracteres, pero de hecho, hay un carácter al final (detrás de 'o') en su distribución de memoria ' \ 0 'significa el final, por lo que solo char a [5] no puede encajar hola, char a [6] = "hola". Entonces "a" son los dos bytes de'a' + '\ 0' ('\ 0 'no mostrar)

#include<stdio.h>
void main()
{
    
    
	char a[6]={
    
    'h','e','l','l','o'};
	//char a[6] ="hello";也行
	printf("%s",a);
	getchar();
}

Además, tenga en cuenta que escribir un "hola" directamente también es una matriz de cadenas, pero no tiene nombre, podemos usar punteros para acceder

#include<stdio.h>
void main()
{
    
    
	char *p="hello";
	printf("%s\n",p); //%s 会读取第一个字符的地址知道读到'\0'
	printf("%c",p[1]);//输出字母e
	getchar();
}

Operación Sao del puntero de matriz

Mira un fragmento de código primero

#include<stdio.h>
void main(){
    
    
	char *p[3]={
    
    
		"hello",
		"my",
		"friend"

	};
	printf("%s",p[1]);
	getchar();
	
}

Inserte la descripción de la imagen aquí
Ahora encontramos que p [1] se puede operar como un puntero de carácter, lo que significa que
p [1] es equivalente a

char a [4] = "mi", * c;
c = a;
donde c es equivalente ap [1]

#include<stdio.h>
void main(){
    
    
	char *p[3]={
    
    
		"hello",
		"my",
		"friend"

	};
	int i;
	for(i=0;i<2;i++)
	{
    
    
		printf("%c\n",p[1][i]);
	}
	getchar();
}

Inserte la descripción de la imagen aquí

Puntero secundario

Este tipo es una matrioska, solo mira una imagen para entender
Inserte la descripción de la imagen aquí

Puntero de función

int (* p) (int x)
El tipo de función apuntado por int
(* p) El nombre del puntero
(int x) Los parámetros que deben introducirse en la función apuntada

Esta es una función,
por ejemplo

#include<stdio.h>


void main(){
    
    
	int go(int x);
	int x,(*p)(int x);
	scanf("%d",&x);
	p=go;//指针指向函数
	//(*p)(x)也行
	p(x);
	getchar();
	getchar();

}

int go(int x)
{
    
    
	printf("you input number is:%d",x);

}

¿Cuál es el beneficio de estas cosas? Con estas cosas, puedo pasar directamente otra función a otra función,
por ejemplo, actualizar

#include<stdio.h>


void main(){
    
    

	int go(int x),x;
	void show(int x, int(*p)(int x));

	scanf("%d",&x);
	show(x,go);
	getchar();
	getchar();

}

int go(int x)
{
    
    
	printf("you input number is:%d",x);

}
void show(int x, int(*p)(int x)){
    
    
	printf("you have inputed!\n");
	p(x);

}

Inserte la descripción de la imagen aquí

Función de puntero

Para decirlo sin rodeos, esta es una función que devuelve una dirección como:

int* go (int* x,int* y)

Parece un puntero de función, porque * tiene un nivel de operación más bajo que (), por lo que el puntero de función agrega (),
por ejemplo

#include<stdio.h>


void main(){
    
    
	
	int *go(int *x);
	int a=5,*p;
	p=go(&a);
	printf("a的地址为:%p,值为:%d",p,*p);
	getchar();


}

int *go(int *x){
    
    
	printf("地址以获取\n");
	return x;
}

Inserte la descripción de la imagen aquí

Puntero de archivo

Esto es interesante, el lenguaje C trata a todos los dispositivos como punteros.
FILE * fp = NULL;
fp = fopen ("ruta del archivo", "w") ("w" es el modo abierto, w está escrito)
fprintf (fb, use "% s", str) esto es lo mismo e imprimir justo delante del puntero indica
otras palabras
printf ("hola) y fprintf (stdout," hola "), como, puntero de pantalla stdout, puntero de teclado stdin
empatía
fputs ("hola", fp)

Lo siguiente es leer el archivo
char s [100]
fp = fopen ("ruta de archivo", "r")
fscanf (fp, "% s", s)
fgets (s, 100, fp) (100 es la longitud máxima) La
diferencia es Qué, fprintf () lee un espacio o retorno de carro y retornos, fgets () lee un retorno de carro y retorna.
Además, fread ()
fread (dirección de recepción de datos, cuántos bytes leídos, el número de elementos de datos, archivo Pointer)
otros manuales son buenos.
Por último, no olvide cerrar
fclose (fp)

Supongo que te gusta

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