直接上图
在注释中说明,复制到编译器查看较好。
从main方法开始逐行看,到调用方法的时候再看f方法中的语句。
如果有其他问题可以私信,看到就会回。
#include<stdio.h>
int k = 7;
int m = 5;
void f(int ** s)
{
//t指针中存储的是:k变量的地址
int *t = &k;
//s中存储的是:一级指针变量t的地址
s = &t;
//*s,解引用找到二级指针中存储的t变量的地址。
//相当于t=&m ,也就是说t中存储的是m变量的地址。
*s = &m;
//k=7,*t解引用找到t中存储的变量m=5,
//**s:*s找到其中存储的地址,找到t变量,再*,通过t中存储的地址找到变量m
//7 5 5
printf("%d %d %d ",k,*t,**s);
}
int main() {
int i = 3;
//p是int类型指针变量,其中存储的是int类型变量i的地址。
//*表示p是一级指针变量。
int * p = &i;
//r也是int类型指针变量,**表示r是二级指针,其中存储的是:一级int类型指针变量。
int ** r = &p;
//将r传入f方法中
f(r);
//i=3
//p中存储的是i的地址,*p=3
//**r:*r找到其中存储的p变量,再*,通过p中存储的地址找到白能量i
//3 3 3
printf("%d %d %d\n",i,*p,**r);
return 0;
}
关于指针这一块的所有东西,在我的指针相关文章中都有讲解。都是在语句上的注释说明。
如下 * p是一级指针 ** p二级指针
然后 * s = &m;
t = &m; //这2句是等价的,所以*s就是t。
所以 * s指向了m,也就是t指向m,所以输出 * t和 ** s都是5
一、表示的东西不同
*p表示p代表相应数据类型在存储单元中存储的首地址,而这个存储单元存储的是相应类型数据的数值。
**p表示p也表示地址,简单的说,这个地址对应的存储单元存储的数也是一个地址,而不是数值,而这个被存储的地址对应的存储单元存储的数据才是真正的相应类型的数值。
二、用法不同
例如int *p;
那么p就是指向int类型变量的一个指针。(即数组)
如果int**p;
那么p就是指向int*类型指针的一个指针。(即指向一维数组的指针,即二维数组)
*p是一级指针。
**p是二级指针。
https://iknow-pic.cdn.bcebos.com/4034970a304e251f43ad055caa86c9177f3e5338
二、表示的含义不同
*p表示p所指向的地址里面存放的是一个int类型的值 。
**p表示p所指向的地址里面存放的是一个指向int类型的指针。
三、指向的内容不同
*p=a指针p将指向a上的内容。
**p=a将变量a的地址 通过指针p 赋值到变量b上。
四、存放的内容的地址不同
*p指向的地址里面存放的是一个值 。
**p指向的地址里面存放的是一个指向p的一级指针。
您好,我是有问必答小助手,您的问题已经有小伙伴帮您解答,感谢您对有问必答的支持与关注!