Compréhension du pointeur du langage C

compréhension de base

#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 signifie la valeur du pointeur

  Par conséquent, bien que les valeurs de var et p soient les mêmes, les deux variables pointent vers deux adresses mémoire.

Ensuite, si vous modifiez la valeur 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;
}

 On peut voir que la valeur de var a changé, la valeur de p n'a pas changé et les adresses mémoire des deux variables n'ont pas changé, ce qui signifie qu'il ne s'agit que d'un simple processus de modification de la valeur. Si vous voulez que la variable p pour changer en fonction de la valeur de var, alors p pointera sur l'adresse mémoire de var

Comme suit, regardez le code ci-dessous pour comprendre

#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 est (valeur | adresse) est (20 | &var)

*p est une variable pointeur, pointant vers l'adresse de var, relative à var exprimée par p est (*p | p) est (valeur | adresse)

arithmétique du pointeur

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

tableau de pointeurs

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

 pointeur de tableau de chaînes

#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]);
    }
}

pointeur à pointeur

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

passer le pointeur à la fonction

fonctions avec des pointeurs comme paramètres

#include <stdio.h>
#include <windows.h>
void countFun(int *s){
    *s=1;
}
int main(){
    SetConsoleOutputCP(65001);
    int size=0;
    countFun(&size);
    printf("%d",size);
}

Les fonctions qui prennent des pointeurs comme paramètres peuvent également accepter des tableaux comme paramètres

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

 pointeur de retour de fonction

Si vous souhaitez revenir dans la fonction, vous devez utiliser statci pour définir des variables statiques. L'utilisation de statique en C/C++ est les variables globales et les variables locales | tutoriel de recrue

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

pointeur de fonction

Par exemple, ce qui suit est une fonction normale

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

puis utilisez le pointeur de fonction

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

Je suppose que tu aimes

Origine blog.csdn.net/xuelang532777032/article/details/130106777
conseillé
Classement