c语言指针方面的问题

直接上图

img


答案是第三个,有点看不懂,*p和**p什么的,真的太绕了

在注释中说明,复制到编译器查看较好。
从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;
}

关于指针这一块的所有东西,在我的指针相关文章中都有讲解。都是在语句上的注释说明。


【C语言基础10:指针进阶】字符指针、指针数组、数组指针、函数指针、函数指针数组、回调函数、数组名详解、杨氏矩阵、字符串旋转_蛋翼的博客-CSDN博客 指针进阶字符指针字符指针的另一种使用方式#include <stdio.h>int main(){ //字符指针的使用 char ch = 'q'; char * pc = &ch; //本质上是把这个字符串的首字符地址存储在了指针变量ps中 const char * ps = "hello world"; //数组存储字符串时,是把整个字符串都存储在其中。 char arr[] = "hello world"; https://blog.csdn.net/weixin_43670978/article/details/123151870

如下 * p是一级指针 ** p二级指针
然后 * s = &m;
t = &m; //这2句是等价的,所以*s就是t。
所以 * s指向了m,也就是t指向m,所以输出 * t和 ** s都是5

img

一、表示的东西不同

*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的一级指针。

您好,我是有问必答小助手,您的问题已经有小伙伴帮您解答,感谢您对有问必答的支持与关注!
PS:问答VIP年卡 【限时加赠:IT技术图书免费领】,了解详情>>> https://vip.csdn.net/askvip?utm_source=1146287632