带你认识指针——C语言的灵魂(一)

前言


       最近复习考研的知识,有机会研究一下C语言的指针,今天就总结一下有时候让我们爱的要死,有时候也恨得要死的指针,到底是什么?书里指针那章的序言说到了,不掌握指针就是没有掌握C的精华,word指针看来真的有他的厉害之处啊。话不多说,开始总结。

       第一篇总结解决一下什么是指针的问题,做了一个小DEMO简要说明指针的用法。


指针定义

指针是一个值为内存地址的变量(或数据对象)


自己的理解:上边的定义简单扼要的告诉我们指针就是变量,变量又是什么呢?变量就是一块内存,就是一个地址,说白了指针就是保存内存地址的变量,有的书上也说了,指针就是地址。为什么要有指针呢?因为C语言的一大特点就是可以直接对物理操作,厉害了我的哥,所以说指针是C语言的一大灵魂嘛。


用内存图(来源于网络)来帮助理解:


1.首先定义了一个整型的变量,也就是分配了一个名叫year的内存空间,存放的内容是2016

2.定义了一个整型的指针变量,将year的地址付给了变量,也就是右边的指针指向左边的变量,因为现在指针里边存放的是year的地址,&这个符号是取地址的意思,下边会讲到



指针声明


类型 + “*” + 变量名  = 指针

注:

1.C语言中NULL被定义为常量,第一行代表指针的初值设为空,表示指针不指向任何地址,不加有可能指向任意的地址

2.指针命名最好里边带有”P”

  1. <span style=“font-size:18px;”>    int  *ptr=NULL;    // 等价于void *ptr    
  2.     int  *ptr_num;  
  3.     char *ptr_name;  
  4.     float *money_ptr;  
  5.     double *p_price;</span>  
    int  *ptr=NULL;    // 等价于void *ptr  
    int  *ptr_num;
    char *ptr_name;
    float *money_ptr;
    double *p_price;


怎么用?(附赠小DEMO)


  • &:代表取地址
  • *:代表根据地址,找到变量,然后取变量值

  1. int num=9;  
  2. int * ptr_num=&num;  
  3.   
  4. //取指针1的地址赋给指针2  
  5. int * ptr_num2=&ptr_num;  
  6.   
  7. //%p指针占位符  % x 16进制占位符  
  8. printf(”num变量的地址是:%p\t%x\n”,ptr_num,&num);  
  9. printf(”\n指针ptr_num的地址:%p\n”,ptr_num2);  
  10.   
  11. //使用指针修改变量值  
  12. *ptr_num=9999;//找到地址所指的内存地址,把这个地址的值改为9999  
  13. printf(”* ptr_num对应的值为:%d\n”,*ptr_num);//取这个地址对应的值  
    int num=9;
    int * ptr_num=&num;

    //取指针1的地址赋给指针2
    int * ptr_num2=&ptr_num;

    //%p指针占位符  % x 16进制占位符
    printf("num变量的地址是:%p\t%x\n",ptr_num,&num);
    printf("\n指针ptr_num的地址:%p\n",ptr_num2);

    //使用指针修改变量值
    *ptr_num=9999;//找到地址所指的内存地址,把这个地址的值改为9999
    printf("* ptr_num对应的值为:%d\n",*ptr_num);//取这个地址对应的值



上边的代码主要演示了一下:取变量地址和取地址对应变量的值,这两个操作,一个用的&,后一个使用*


上边代码也展示了如果通过操纵指针来改变变量的值,我们在看看内存是怎么体现的


综合的小DEMO:

  1. int num1=1024;  
  2.     int num2=2048;  
  3.     int * ptr1;  
  4.     int *ptr2;  
  5.     ptr1=&num1;  
  6.     ptr2=&num2;  
  7.     printf(”num1的值是%d\tnum1的地址是:%p\n”,num1,ptr1);  
  8.     printf(”num2的值是%d\tnum2的地址是:%p\n”,num2,ptr2);  
  9.   
  10.     //将变量1的值,赋给变量2  
  11.     // num2=num1;*ptr2=*ptr1; 等价写法,可以把后者看成变量  
  12.   
  13.     //直接操作指针  
  14.     ptr2=ptr1; //值没有变,地址变了  
  15.   
  16.     printf(”重新赋值后:\n”);  
  17.     printf(”num1的值是%d\tnum1的地址是:%p\n”,num1,ptr1);  
  18.     printf(”num2的值是%d\tnum2的地址是:%p\n”,num2,ptr2);  
  19.   
  20.     *ptr2=1111;  
  21.     printf(”重新赋值后:\n”);  
  22.     printf(”num1的值是%d\tnum1的地址是:%p\n”,num1,ptr1);  
  23.     printf(”num2的值是%d\tnum2的地址是:%p\n”,num2,ptr2);  
int num1=1024;
    int num2=2048;
    int * ptr1;
    int *ptr2;
    ptr1=&num1;
    ptr2=&num2;
    printf("num1的值是%d\tnum1的地址是:%p\n",num1,ptr1);
    printf("num2的值是%d\tnum2的地址是:%p\n",num2,ptr2);

    //将变量1的值,赋给变量2
    // num2=num1;*ptr2=*ptr1; 等价写法,可以把后者看成变量

    //直接操作指针
    ptr2=ptr1; //值没有变,地址变了

    printf("重新赋值后:\n");
    printf("num1的值是%d\tnum1的地址是:%p\n",num1,ptr1);
    printf("num2的值是%d\tnum2的地址是:%p\n",num2,ptr2);

    *ptr2=1111;
    printf("重新赋值后:\n");
    printf("num1的值是%d\tnum1的地址是:%p\n",num1,ptr1);
    printf("num2的值是%d\tnum2的地址是:%p\n",num2,ptr2);



后记


了解一个概念就是反复的去实践,看看不同情况下的操作会得出什么样的结果,概念在实践中体会的会更加的深刻

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值