我正在研究 C 中的指针。尝试了很多事情来确保我理解指针是如何工作的,但我发现了一些我不理解的东西。这是有问题的代码片段:
int b = 30;
printf("(void *)(size_t)b: %p\n", (void *)(size_t)b);
输出:
(void *)(size_t)b: 0x1e
这就是值 30,以十六进制形式存储在“b”处。我已将表达式放入其中,这样我就知道控制台中的哪个是哪个。
我正在使用 GCC 13.2.1-6 和标志编译代码
-Wall -Werror -Wextra -std=c17 -pedantic-errors
在 x86-64 Linux 机器上。我不知道它是否相关(我是初学者),但是 int
对我来说有 4 个字节。
代码编译良好,没有错误。我不明白为什么它会给出这样的输出。
int b = 30;
您现在的
int
值为 30 (0x1e)。
(size_t)b
您告诉编译器将其视为
size_t
值 30 (0x1e)。
(void *)(size_t)b
您告诉编译器将这个
size_t
值 30 (0x1e) 视为 void *
。
printf("%p", (void *)(size_t)b);
打印指针的值,即 30 (0x1e)。请注意,
%p
打印指针,而不是指针指向。
并且您不能取消引用该指针(通过在
(void *)(size_t)b
前面添加星号),因为您的指针不是有效,即它实际上并不指向某物,因此取消引用它将是未定义的行为(即不好)。