关于指针与引用的差别——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]\n", *p); 9 } 10 11 void testpointer(int **k){ 12 printf("[%x]\n", *k); // **k(<指针的指针>,名为k): 0x65fec8 13 // 打印出*k即p值为 0x65fecc 14 15 printf("{%d}\n", *(*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); 函数体略
--------蓝天上的云_转载请注明出处.