C 打印指针值时是否需要间接运算符?

C 打印指针值时是否需要间接运算符?,c,C,我正在读一本关于c语言的书,对其中一个字符串指针示例有一个问题 int x; char *str = "Food"; printf("Pointer variable value: %p\n", *str); printf("Pointer points to: %s\n", str); printf("Memory locations of chars are: \n"); for(x = 0; x < 5; x++) printf("%p\n", str[x]); intx;

我正在读一本关于c语言的书,对其中一个字符串指针示例有一个问题

int x;
char *str = "Food";
printf("Pointer variable value: %p\n", *str);
printf("Pointer points to: %s\n", str);
printf("Memory locations of chars are: \n");

for(x = 0; x < 5; x++)
   printf("%p\n", str[x]);
intx;
char*str=“食物”;
printf(“指针变量值:%p\n”,*str);
printf(“指针指向:%s\n”,str);
printf(“字符的内存位置为:\n”);
对于(x=0;x<5;x++)
printf(“%p\n”,str[x]);
为什么在第一个
printf
中字符串名称前面需要间接运算符,而在
循环
printf
中不需要运算符地址


但是,当我执行这个程序时,两个“o”字符实际上具有相同的地址。当我在
str[x]
前面添加运算符的地址时,地址变得连续。

下一行是错误的

printf("Pointer variable value: %p\n", *str);
要打印指针,第二个参数必须是
str

printf("Pointer variable value: %p\n", str);
下面这行也错了

printf("%p\n", str[x]);
要打印指针,请将第二个参数更改为
&str[x]

printf("%p\n", &str[x]);

%p
用于打印指针

来自C标准#7.21.6.1p8

p
该参数应是指向void的指针。指针的值以实现定义的方式转换为一系列打印字符

编译器必须对这两条语句发出警告消息:

printf("Pointer variable value: %p\n", *str);

原因是
%p
希望指针指向
void
类型,而您给出的是
char
类型

*str
相当于
*(str+0)
*(str+0)
str[0]
,它是字符串
str
第一个位置的字符

printf("Pointer variable value: %p\n", str);
因此,如果要打印指针,则应给出
str
,而不是
*str
;如果要打印字符串中每个字符的地址,则应给出
&str[x]

运算符
&
用于获取地址,运算符
*
用于解引用

所以

这些操作符
&
*
在一个接一个地使用时相互抵消。因此,

&(*(str + x)) -> (str + x)
str+x
是位置
x
处字符的地址

因此,正确的说法是:

printf("Pointer variable value: %p\n", str);


该示例是错误的–它应该为第一个
%p
传递
str
,而不是
*str
,为第二个
%p
传递
&str[x]
str+x
,而不是
str[x]
。它是哪本书?D=请始终显示准确的代码。尽可能使用复制和粘贴。那么他们使用什么类型说明符呢?
printf("Pointer variable value: %p\n", str);
printf("%p\n", &str[x]);