• 【C语言精髓 之 指针】指针*、取地址&、解引用*、引用&


    /**
     * @file            
     * @author          jUicE_g2R(qq:3406291309)————彬(bin-必应)
     *						一个某双流一大学通信与信息专业大二在读	
     * @copyright       2023.9
     * @COPYRIGHT			 原创技术笔记:转载需获得博主本人同意,且需标明转载源
     * @language        C 
     */
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • UpData Log👆 2023.9.22 更新进行中
    • Statement0🥇 一起进步
    • Statement1💯 有些描述是个人理解,可能不够标准,但能达其意

    技术提升站点

    • 定义指针 与 取地址
    int val=1;		//为 变量名为val 的 整型数据 开辟空间,并存下val的值
    int* p=&val;	//定义一个指针变量(是指针的原因使用到了*)的名字为p,p记录的是(&val)val变量的地址,此时 p指针 指向 val 这个整型变量
    printf("%d 的地址是 %p\n",val, p);
    
    • 1
    • 2
    • 3
    • 解引用:返回p所指对象的值
    //要使用 p所指向地址的值(即val的值) 的话,需要 将p(实质上是 val 的地址)通过 * 解出来
    printf("指针p指向的val的地址为 %p,解引用得到val的值为%d",p, *p);
    
    • 1
    • 2
    • 通过 指针 修改 指针 所指地址的变量的值
    //定义指针后,*p 实质上就是 val,修改 *p 就是修改 val(因为变量名val 与 p 都指向的 val的地址)
    *p=2;			//此时 *p=val=2
    printf("修改后val的值为:%d",val);
    
    • 1
    • 2
    • 3
    • 修改指针的指向
    //声明两个变量,
    int a=1,b=2;
    int* p=&a;		//初始化 p 指向a变量
    p=&b;			//修改 p指针 存储 b的地址,p由 指向a变量 变为 指向b变量
    printf("修改后的p指针指向的值为:%d",*p);
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 无指向的野指针

    注:声明一个指针但不给分配指向,这个指针是无效的野指针(必须要给指针明确的指向)

    要先为 开辟一个空间(内存) 来进行 存储、调用、修改 操作

    //错误示范
    int* p;
    *p=2; cout<<*p;
    
    //下面这种是可以的
    int* p;int val;
    p=&val;			//分配指向
    *p=2;
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 输入
    int val;    int *p=&val;
    scanf("%d",p);      //p=&val,效果等同于scanf("%d",&val)
    printf("%d",val);
    
    • 1
    • 2
    • 3
    • (*p)++ 、 * (p++) 、*p++ 的区别

    运算符优先级

    点击了解更多

    圆括号()优先级高于下面两种,结合方式是 自左向右不论任何情况先执行括号内的东西!

    自增运算符++(不论前缀还是后缀) > 取值运算符*,这两种的结合方式都是 自右向左

    //(*p)++ :p指针指向对象的值加1(地址值不变)
    int val=1;    int* p=&val;
    (*p)++;		printf("p指针指向对象的值为%d,val的值为%d",(*p), val);//Output:2,2
    
    //*(p++) 与 *p++ 操作结果相同,都是将地址值加1个整型字节(4bit)
    int val=1;    int* p=&val;
    printf("val的地址为%p\n",p);
    *p++;			//现在的p指针就是一个野指针,(*p)是无效的
    printf("p指针的值(地址)为%p",p);
    //Output:
    val的地址为63fe14
    p指针的值(地址)为63fe18
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    根据运算符优先级的结合方式可以推出:++ *p++(*p)(思索一下自右向左的意思)操作的结果是一致的(即对 p指针指向对象的值加1)

    • 传参与收参

    如何修改 val 的值?

    /*---------传参直接传地址--------*/
    //传的如果是地址的话,都是直接对 &val这个地址 进行操作(来直接修改地址对应的值)
    void Update(int* addr){ //(接收参数的是地址)声明一个指针变量为address(此时 address=p=&val)
        (*addr)++;          //将地址 解引用 得到值,对值修改
    }
    /*写法二
    void Update(int* addr){
    	int temp=(*addr);   //申请一个新内存,用来操作值,然后将p指向对象的值存下(temp现在就是 val的值 的代理人)
        temp++;		(*addr)=temp;   
    }
    */
    int main(int argc,char* argv[]){
        int val=1;    int* p=&val;
        Update(p);          //传入的是 &val(val的地址)
        printf("%d",val);   return 0;
    }//Output:2
    
    /*---------传参传的是val的值(地址的解引用)--------*/
    void Update(int temp){ 
        temp++;				//此时的修改是影响不到val的
    }
    int main(int argc,char* argv[]){
        int val=1;    int* p=&val;
        Update(*p);        //传入的是 val(val的值),就和传普通的变量一样!
        printf("%d",val);   return 0;
    }//Output:1
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26

    点击直通指针的应用 块状链表

    指针 是 C语言 的精华,是 C语言 的尽头,值得细品!!!

  • 相关阅读:
    asp.net core webapi接收application/x-www-form-urlencoded和form-data参数
    RT-DETR优化改进:轻量级Backbone改进 | VanillaNet极简神经网络模型 | 华为诺亚2023
    投标管理与工程实施管理的关键步骤及策略
    视频怎么做成二维码?在线教学视频码的制作技巧
    PHP:类型运算符
    【论文阅读】VDBFusion: Flexible and Efficient TSDF Integration of Range Sensor Data
    python3多进程和多线程使用场景如何区分
    数据结构——栈和队列
    JavaScript高级
    抓包整理外篇fiddler————了解工具栏[一]
  • 原文地址:https://blog.csdn.net/qq_73928885/article/details/133191263