entendimiento básico
#include <stdio.h>
#include <windows.h>
int main(){
SetConsoleOutputCP(65001);
int var=20;
int p=var;
printf("%d\n",var);
printf("%d\n",p);
printf("%p\n",&var);
printf("%p\n",&p);
return 0;
}
%p significa el valor del puntero
Como resultado, aunque los valores de var y p sean los mismos, las dos variables apuntan a dos direcciones de memoria.
Luego, si cambia el valor de la variable var
#include <stdio.h>
#include <windows.h>
int main(){
SetConsoleOutputCP(65001);
int var=20;
int p=var;
printf("%d\n",var);
printf("%d\n",p);
printf("%p\n",&var);
printf("%p\n",&p);
printf("-------\n");
var=11;
printf("%d\n",var);
printf("%d\n",p);
printf("%p\n",&var);
printf("%p\n",&p);
return 0;
}
Se puede ver que el valor de var ha cambiado, el valor de p no ha cambiado y las direcciones de memoria de las dos variables no han cambiado, lo que significa que este es solo un proceso simple de cambiar el valor.Si desea que la variable p para cambiar según el valor de var, entonces p apuntará a la dirección de memoria de var
De la siguiente manera, mire el código a continuación para entender
#include <stdio.h>
#include <windows.h>
int main(){
SetConsoleOutputCP(65001);
int var=20;
int *p;
p=&var;
printf("%d\n",var);
printf("%d\n",*p);
printf("%p\n",&var);
printf("%p\n",p);
printf("-------\n");
var=11;
printf("%d\n",var);
printf("%d\n",*p);
printf("%p\n",&var);
printf("%p\n",p);
return 0;
}
var es (valor | dirección) es (20 | &var)
*p es una variable de puntero, que apunta a la dirección de var, relativa a var expresada por p es (*p | p) es (valor | dirección)
aritmética de punteros
#include <stdio.h>
#include <windows.h>
int main(){
SetConsoleOutputCP(65001);
int var[]={10,100,200};
int *ptr;
ptr=&var[0];// 也可以是ptr=var
for(int i=0;i<3;i++){
printf("var[%d]值:%d\n",i,*ptr);
printf("var[%d]地址:%p\n",i,ptr);
ptr++;
}
return 0;
}
matriz de punteros
#include <stdio.h>
#include <windows.h>
#define MAX 3
int main(){
SetConsoleOutputCP(65001);
int var[MAX]={10,100,200};
int *ptr[MAX];
for(int i=MAX-1;i>=0;i--){
ptr[i]=&var[i];
printf("%d\n",*ptr[i]);
}
return 0;
}
puntero de matriz de cadenas
#include <stdio.h>
#include <windows.h>
#define MAX 3
int main(){
SetConsoleOutputCP(65001);
char *name[]={
"小白",
"小红",
"小明"
};
for(int i=MAX-1;i>=0;i--){
// printf("%s\n",name[i]);
puts(name[i]);
}
}
puntero a puntero
#include <stdio.h>
#include <windows.h>
#define MAX 3
int main(){
SetConsoleOutputCP(65001);
int a=1;
int *b,**c;
b=&a;
c=&b;
printf("%d\n",a);
printf("%d\n",*b);
printf("%d\n",**c);
printf("%p\n",&a);
printf("%p\n",b);
printf("%p\n",c);
}
pasar el puntero a la función
funciones con punteros como parámetros
#include <stdio.h>
#include <windows.h>
void countFun(int *s){
*s=1;
}
int main(){
SetConsoleOutputCP(65001);
int size=0;
countFun(&size);
printf("%d",size);
}
Las funciones que toman punteros como parámetros también pueden aceptar matrices como parámetros
#include <stdio.h>
#include <windows.h>
double avg(int *arr,int size){
int count=0;
for(int i=0;i<size;i++){
count+=arr[i];
};
double avgVal=(double)count/size;
return avgVal;
}
int main(){
SetConsoleOutputCP(65001);
int arr[]={1,2,3,4,5,6};
int size=sizeof(arr)/sizeof(arr[0]);
double avgVal=avg(arr,size);
printf("%d",avgVal);
}
puntero de retorno de función
Si desea regresar a la función, debe usar statci para definir variables estáticas. El uso de estática en C/C++ son variables globales y variables locales | tutorial para principiantes
#include <stdio.h>
#include <time.h>
#include <stdlib.h>
/* 要生成和返回随机数的函数 */
int * getRandom( )
{
static int r[10];
srand((unsigned) time(NULL));
for(int i=0;i<10;i++){
r[i]=rand()%10;
printf("%d\n",r[i]);
}
return r;
}
/* 要调用上面定义函数的主函数 */
int main ()
{
int *p;
p=getRandom();
printf("\n-------\n");
for(int i=0;i<10;i++){
printf("%d\n",*(p+i));
}
return 0;
}
puntero de función
Por ejemplo, la siguiente es una función normal
#include <windows.h>
#include <stdio.h>
int cyc1(int x,int y){
return x>y?x:y;
}
int main(void){
SetConsoleOutputCP(65001);
int a,b,c;
printf("请输入3个整数:");
scanf("%d %d %d",&a,&b,&c);
int val=cyc1(cyc1(a,b),c);
printf("%d",val);
return 0;
}
luego usa el puntero de función
#include <windows.h>
#include <stdio.h>
int cyc1(int x,int y){
return x>y?x:y;
}
int main(void){
SetConsoleOutputCP(65001);
int a,b,c;
int (*p)(int,int)=&cyc1;
printf("请输入3个整数:");
scanf("%d %d %d",&a,&b,&c);
int val=p(p(a,b),c);
printf("%d",val);
return 0;
}