【问题标题】:dereferencing pointer to a pointer with one Asterisk [duplicate]取消引用指向带有一个星号的指针的指针[重复]
【发布时间】:2021-11-28 07:35:20
【问题描述】:
#include <stdio.h>
int main(){
    int integer = 300;
    int* p = &integer;
    int** pp = &p;
    printf("*pp = %i", *pp);
}

我的问题是 *pp 实际上是什么?打印 *p 地址中的值是什么意思?

【问题讨论】:

标签: c pointers pointer-to-pointer


【解决方案1】:

它是对integer的引用转换为整数值。

要打印参考,您应该使用%p 格式说明符而不是%i 格式说明符。

[pp] -> [p] -> [integer]

如果你修改程序,你可以看到引用以及它们是如何链接的:

int main()
{
    int integer = 300;
    int* p = &integer;
    int** pp = &p;
    printf("pp = %p *pp = %p\n",(void *)pp, (void *)*pp);
    printf("&integer = %p &p = %p\n", (void *)&integer, (void *)&p);
}
pp =        0x7fffb6adc7d8 *pp =    0x7fffb6adc7e4
&integer =  0x7fffb6adc7e4 &p =     0x7fffb6adc7d8

【讨论】:

    【解决方案2】:
    #include <stdio.h>
    int main(){
        int integer = 300;
        int* p = &integer;
        int** pp = &p;
        printf("**pp=%d\n", **pp);
        printf("*p=%d\n", *p);
        printf("*pp = %p\n", *pp);
        printf("p=%p\n", p);
        printf("&integer=%p\n", &integer);
        printf("&(*p)=%p\n", &(*p));
        printf("pp=%p\n", pp);
        printf("&p=%p\n", &p);
    }
    

    因为&amp;(*p) 就是p,所以*pp 就是*p 的地址。
    由于%i 是整数,但您要打印的是指针。所以我把它改成了%p

    【讨论】:

    • 在您的问题中,您写道:"Since %i is integer"——我将此解释为意味着%i 是正确的printf 整数格式说明符。然而,这并不完全正确。 printf 格式说明符 %i 并不适用于所有整数数据类型,仅适用于数据类型 int。例如,整数数据类型long 的正确格式说明符是%li。对于long,只写%i 是错误的。它可能适用于某些平台(例如 Windows),但会在其他平台(例如 Linux)上失败。因此,您可能需要考虑将通用单词“integer”更改为数据类型“int”。
    • 您可能还想详细说明您发布的代码在做什么。如果您只是粘贴代码而不解释该代码的含义,那么您的答案将更难理解。
    【解决方案3】:

    我不是 C 编程方面的专家,但我相信我对指针有相当的了解。 那么,要了解*pp是什么,你需要了解*运算符是干什么用的?

    它无疑用于乘法,但它也用于指针解引用。

    所以当我说*pp时,它表示pp的值,即存储在pp中的值。 C 中定义的每个变量都有自己的内存空间。所以*pp 表示存储在分配给变量pp 的内存空间中的内容。

    在你的情况下,

    int integer = 300;
    

    声明了一个名为integer 的整数类型变量并赋予其值300

    int* p = &integer;
    

    声明了一个需要指向整型变量的指针,并给出integer的地址。

    int** pp = &p;
    

    声明一个需要指向整型变量的指针,并给出p的地址

    printf("*pp = %i", *pp);
    

    *pp 表示打印存储在pp 中的值,即p 的地址 **pp 表示打印存储在p 中的值中存储的值,即300

    正如我之前解释的,每个变量都有自己的内存空间,每个内存空间都会分配一个地址,以便可以识别它(我们有一个用于联系我们的电子邮件地址的方式)通过电子邮件或用于通过邮寄方式与我们联系的邮寄地址)。

    希望这能回答您的问题。如果有的话,一定要问后续问题。 干杯..!!

    【讨论】:

    • Re “所以当我说*pp时,它表示pp的值,即pp中存储的内容”:不。不要写这个;这会让学生感到困惑。根据 C 2018 6.2.5 20,指针的值提供对某些实体的引用。在int **pp = &amp;p;之后,pp的值为p的地址,*pp的值为p,而不是pp中存储的内容。可以说是 at pp 存储的内容,但那是不同的。避免引用指针,就好像它是它指向的内存一样。例如,不要说“释放pp”来表示“释放pp 指向的内存”。
    猜你喜欢
    • 1970-01-01
    • 2013-01-04
    • 2012-03-25
    • 1970-01-01
    • 1970-01-01
    • 2010-10-27
    • 2017-01-26
    • 1970-01-01
    相关资源
    最近更新 更多