tip:本贴为学习和test自测记录,thank you for lmy。
- 引用
- 一级指针和二级指针
- 为什么要用二级指针
- Run一级指针:
- Run二级指针:
float a=0.0 //函数定义
func (a)//函数调用
func(&a){}//函数实现,采用引用的方式不会copy一份,而是直接对地址处数据进行处理
一级指针和二级指针
- 先用一个很好的例子阐述:
void lmy(int &x,float* y,float ** z){}//函数实现,其中x是引用,y是一级指针,z是二级指针
int main(
int a=8
float b=4.0
float c[]={8.0,4.0}
lmy(a,&b,&c)//其中a是int,b地址,c是二级地址(数组名表示地址)
)
- 概念
假设C的地址是四个字节0x00000008,C中的内容是"争渡,争渡,惊起一滩鸥鹭"。B的地址是四个字节0x00000004
对于一级指针:
B= 0x00000008; //B的内容 *B = "争渡,争渡,惊起一滩鸥鹭"; //B解引用,也就是B指针指向的C的值 &B = 0x00000004; //B取地址,B的地址是0x00000004
对于二级指针
*A = B= 0x00000008; //A解引用后是B的内容 **A = *B = "争渡,争渡,惊起一滩鸥鹭"; //B解引用,也就是B指针指向的C的值 A = &B = 0x00000004; //A存的是B的地址,B的地址是0x00000004 &A = 0x00000000; //A取地址为什么要用二级指针
因为会存在一级指针难以顾及的场景。
Run一级指针:#includeusing namespace std; int z= 4; int y= 8; int *m; void pripointer(int *n) { cout<<"n="< m = &z; cout<<"m="< 输出结果见下
m=0x404068, &m=0x404198, *m=4 n=0x404068, &n=0x7ffdd3d5ef28, *n=4 m=0x404068, &m=0x404198, *m=4Q1:为什么m没有被修改?
Run二级指针:
A1:&m!=&n,即一级指针m和n是分别开辟的空间,n=&y只能修改n的指向。
如果想修改*m就需要二级指针操作。...//部分代码同上 void secpointer(int **n) { cout<<"n="<m = &z; cout<<"m="< 输出结果如下:
m=0x404068, &m=0x404198, *m=4 n=0x404198, &n=0x7ffe9be33fe8, *n=0x404068, **n=4 n=0x404198, &n=0x7ffe9be33fe8, *n=0x40406c, **n=8 m=0x40406c, &m=0x404198, *m=8
- 这里m是一级指针,&m是作为二级指针参数。 n是二级指针,存储的是&m,所以n=&m 。
- n=&m左右解引用得n=m,即n的解引用n指向m。此时赋值*n=&y,会修改m的值。
- n=m左右解引用得n=*m,即n指向和m指向y。



