zoukankan      html  css  js  c++  java
  • 关于指针与引用的差别——C++

    准备

    https://zhuanlan.zhihu.com/p/27974028

    开始

    int   是int类型变量声明

    int * 是int指针声明,指针其实就是地址变量,用来储存地址值的"容器"

    首先有一个概念

    int a;

    int &x = a;

    a = 123;

    以下用%d代替变量a的值

    那么,

    a                     int型变量

    %d         a目前储存的数据,整数123

    &k                   int型变量,a的别名

    假如现在有一个指针p和一个引用k

    &k = p;

    p         地址变量,即指针

    *p       p目前储存的数据,即地址0x12345678

    int *&k     地址变量,即指针,p的别名

    总结,打印*p,即打印目前取得的值(是值,数据)

    p或者*&k是指针(地址变量,是用来储存地址的容器)

    容器可以储存不同的数据,用来存放不同的值

    而数据是数值,如同123,就是一个值而已

    用法区别:

    引用的用法之一:传递指针给子函数,并在子函数中改变这个指针的值(指向的地址)

    地址的用法:传递地址*p给子函数,子函数中变量再怎么变化也不会影响main中的指针p


    附上:指针值传递、地址传递和引用传递

    其实在c里也是可以用巧妙的方法传递指针的,只要用新指针k指向目标指针b,然后传递k的地址   [k是指针的指针,他的值是 指针b所在地址]

     1 #include <stdio.h>
     2 
     3 void testpointer(int **);
     4 int main(void){
     5     int a = 7;
     6     int * p = &a;           // p: 0x65fecc
     7     testpointer(&p);
     8     printf("In Main,p is [%d]
    ", *p);
     9 }
    10 
    11 void testpointer(int **k){
    12     printf("[%x]
    ", *k);     // **k(<指针的指针>,名为k): 0x65fec8
    13                             // 打印出*k即p值为 0x65fecc
    14     
    15     printf("{%d}
    ", *(*k));      // *k就是p,都指向着int变量a, 所以间接运算符结果为a的值7
    16     int b = 9;
    17     *k = &b;                // 修改*k 就是修改p。
    18     /* 因为**k是指针的指针,名为k,指向p的地址。
    19     *k是<指针的指针 k>的值,指针的指针的值自然是指针了,所以*k就是p     */
    20 }

    运行结果:

    [65fecc]
    {7}
    In Main,p is [9]

     另外也可以不用二级指针,而使用函数返回值

    如 SeqList * L;

    L = InitList();

    声明 SeqList * InitList(void); 函数体略

    --------蓝天上的云_转载请注明出处.
  • 相关阅读:
    配置管理puppet
    ruby安装
    angularjs 安装篇
    idea 快捷键
    rabbitmq java queue
    spring cloud bus rabbitmq
    rabbitmq 安装篇
    spring cloud eureka
    spring cloud config
    postgre 导入sql文件
  • 原文地址:https://www.cnblogs.com/yucloud/p/10493864.html
Copyright © 2011-2022 走看看