C 打印指针值时是否需要间接运算符?
我正在读一本关于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;
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]);