gpt4 book ai didi

c - 在 C 中打印指针

转载 作者:太空狗 更新时间:2023-10-29 16:20:27 26 4
gpt4 key购买 nike

我试图用指针来理解一些东西,所以我写了这段代码:

#include <stdio.h>

int main(void)
{
char s[] = "asd";
char **p = &s;

printf("The value of s is: %p\n", s);
printf("The direction of s is: %p\n", &s);

printf("The value of p is: %p\n", p);
printf("The direction of p is: %p\n", &p);

printf("The direction of s[0] is: %p\n", &s[0]);
printf("The direction of s[1] is: %p\n", &s[1]);
printf("The direction of s[2] is: %p\n", &s[2]);

return 0;
}

当用 gcc 编译它时,我收到这些警告:

$ gcc main.c -o main-bin -ansi -pedantic -Wall -lm
main.c: In function ‘main’:
main.c:6: warning: initialization from incompatible pointer type
main.c:9: warning: format ‘%p’ expects type ‘void *’, but argument 2 has type ‘char (*)[4]’
main.c:11: warning: format ‘%p’ expects type ‘void *’, but argument 2 has type ‘char **’
main.c:12: warning: format ‘%p’ expects type ‘void *’, but argument 2 has type ‘char ***’

(gcc的标志是因​​为我必须是C89)

为什么指针类型不兼容?数组的名称不是指向它的第一个元素的指针吗?所以如果 s 是指向 'a' 的指针,&s 必须是 char **,不是吗?为什么我会收到其他警告?我是否必须使用 (void *) 转换指针才能打印它们?

运行时我得到这样的结果:

$ ./main-bin
The value of s is: 0xbfb7c860
The direction of s is: 0xbfb7c860
The value of p is: 0xbfb7c860
The direction of p is: 0xbfb7c85c
The direction of s[0] is: 0xbfb7c860
The direction of s[1] is: 0xbfb7c861
The direction of s[2] is: 0xbfb7c862

s 的值和它的方向(当然还有 p 的值)如何相同?

最佳答案

“s”不是“char*”,而是“char[4]”。因此,“&s”不是“char**”,而是“指向 4 个字符数组的指针”。您的编译器可能会将“&s”视为您编写了“&s[0]”,这大致相同,但是是“char*”。

当你写“char** p = &s;”你试图说“我希望 p 被设置为当前指向“asd”的东西的地址。但是目前没有任何东西指向到“asd”。只有一个数组持有“asd”;

char s[] = "asd";
char *p = &s[0]; // alternately you could use the shorthand char*p = s;
char **pp = &p;

关于c - 在 C 中打印指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/197757/

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