Comprensión del puntero del lenguaje C

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;
}

Supongo que te gusta

Origin blog.csdn.net/xuelang532777032/article/details/130106777
Recomendado
Clasificación