c语言指针理解

基本理解

#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是指针的值的意思

  结果看 var和p的值虽然一样,但是两个变量是指向两个内存地址。

那如果改变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;
}

 可以看到var的值变了,p的值没变 而且两个变量的内存地址也不变,也就是说这只是一个简单的改变值得过程,如果你要想变量p根据var值变化而变化,那p就要指向var的内存地址

如下,看下下面的的代码理解下

#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 是( 值 | 地址 ) 就是  ( 20 | &var)

*p是指针变量,指向 var的地址,相对于var 以p来表达就是( *p | p)就是( 值 | 地址 )

扫描二维码关注公众号,回复: 14900488 查看本文章

指针算数运算

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

指针数组

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

 字符串数组指针

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

指向指针的指针

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

传递指针给函数

指针作为参数的函数

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

指针作为参数的函数,也能接受数组作为参数

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

 函数返回指针

函数内要return 必须 用statci定义静态变量C/C++ 中 static 的用法全局变量与局部变量 | 菜鸟教程

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

函数指针

例如下面是正常的函数

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

然后用函数指针

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

猜你喜欢

转载自blog.csdn.net/xuelang532777032/article/details/130106777