关于指针与引用的差别——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); 函数体略

--------蓝天上的云_转载请注明出处.
原文地址:https://www.cnblogs.com/yucloud/p/10493864.html