gpt4 book ai didi

c - 理解指向指针概念的指针

转载 作者:太空狗 更新时间:2023-10-29 15:28:56 26 4
gpt4 key购买 nike

我是 C 语言的初学者,我正在尝试理解指针到指针的概念。我有以下例子

int main() {
char *names[]={"Peter", "Dan"};
printf("names = %p\n", names);
printf("(char *)names = %p\n", (char *)names);
printf("(char **)names = %p\n", (char **)names);
printf("*(char *)names = %p\n", *(char *)names);
printf("*(char **)names = %p\n", *(char **)names);
return 0;
}

Output:
names = 0x7fff167f7c00
(char *)names = 0x7fff167f7c00
(char **)names = 0x7fff167f7c00
*(char *)names = 0x58
*(char **)names = 0x400658

我的问题是为什么 *(char *)names 不返回 0x400658?从上面的输出我可以看到 (char *)names 的值是 0x7fff167f7c00,现在如果我取消引用它应该显示 0x400658 对吗?

有人可以向我解释一下这是如何工作的吗?

在初始问题后编辑:

我做了一些进一步的分析并得出了一些理论,但仍然需要帮助才能理解。当执行 (char *)names 时,它认为它是指向 char 的指针,因此 *(char *)names 打印 0x400658 地址的 1 个字节,即 0x58。但是在 (char **)names 的情况下,它认为这是指向指针的指针,并且在取消引用时它给出了整个地址,即 0x400658。下面将帮助像我这样的新手更多地理解这一点

printf("notes =%p\n", notes);
printf("(char *)notes+1 =%p\n", ((char *)notes+1));
printf("(char **)notes+1 =%p\n", ((char **)notes+1));

Output:
notes =0x7fff75e4c260
(char *)notes+1 =0x7fff75e4c261
(char **)notes+1 =0x7fff75e4c268

以上是我的理论,但现在可以说我观察到的是正确的,但有时会低于输出

*(char **)notes =0x4007ec
*(char *)notes =0xffffffec

考虑到我的理论是正确的,这应该是 0xec 吗?为什么要附加 ffff ?我在这里遗漏了什么吗?

最佳答案

我是这样读的:

// (char*) is an address (of char): 8 bytes
(char *) names = 0x7fff167f7c00 // actual address of names

// (char**) is an address (of char*): 8 bytes
(char **) names = 0x7fff167f7c00 // actual address of names.

// *(char*) is a char: 1 byte.
*(char *) names = 0x58 // first byte of the first value of names (ie address of "Peter").

// *(char **) is an address (of char): 8 bytes
*(char **)names = 0x400658 // first value of names (ie address of "Peter").

关于0xec

这段代码:printf("*(char *)names = %p\n", *(char *)names); 打印一个指针(因为 %p) 并且给定的值是 *(char *)char

实际情况是给定的 char(1 字节)在打印之前被转换为指针(8 字节)。

此转换旨在失败。您不能从单个数据位获得有效指针。

对于 0x58,由于 char 是 88,而 88 作为 8 字节整数是 0x00..0058,它被打印为 0x58

Char 是有符号类型。 0xec,因为char是-20,-20作为4字节有符号整数是0xffffffec,符号字节填充所有新位。那叫sign propagation .

所以你可以看到0xec被转换成了0x00000000ffffffec。为什么符号传播只发生在前 4 个字节可能有多种解释。我首先看到的是性能。

无论如何,char 到指针的转换将取决于编译器、目标等...并且因为结果是不可用的,所以它可以是任何东西。

关于c - 理解指向指针概念的指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29180072/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com