嗨,我是编程新手。
在下面的代码中,str
是一个指向字符的指针,因此str
应该包含字符'h'的地址。因此,%p应该用于打印该地址。但我不明白%s是如何用于打印指针参数的。
#include<stdio.h>
int main (){
char s[] = "hello";
char *str = s;
int a[] = {1, 2, 3, 4, 5};
int *b = a;
printf("%s\n", str); // I don't understand how this works ?
printf("%c\n", *str); // This statement makes sense
printf("%c\n", *(str + 1)); // This statement also makes sense.
printf("%p\n",str); // This prints the address of the pointer str. This too makes sense.
printf("%d\n",*b); // makes sense, is the same as the second print.
// printf("%d",b); // I don't understand why str pointer works but this gives a compile error
return 0;
}
答案 0 :(得分:4)
char s[] = "hello";
声明一个名为s的零终止字符数组。它和写作一样
char s[6] = { 'h', 'e', 'l', 'l', 'o', '\0' };
如您所见,引号是简写。
char *str = s;
这声明str
是一个指向角色的指针。然后,它会str
指向s
中的第一个字符。换句话说,str
包含s
中第一个字符的地址。
int a[] = {1, 2, 3, 4, 5};
声明一个整数数组。它将它们初始化为1-5,包括值。
int *b = a;
声明b
是指向int的指针。然后,它使b
指向a
中的第一个int。
printf("%s\n", str);
%s
说明符接受字符串中第一个字符的地址。 printf
然后从该地址开始,打印它看到的字符,直到最后看到\0
字符。
printf("%c\n", *str);
这将打印str
中的第一个字符。由于str
指向一个字符(字符串中的第一个字符),因此*str
应该获得指向的字符(字符串中的第一个字符)。
printf("%c\n", *(str + 1));
这会打印str
中的第二个字符。这是编写str[1]
的漫长道路。这背后的逻辑是指针算法。如果str
是字符的地址,则str + 1
是数组中下一个字符的地址。由于(str + 1)
是地址,因此可以取消引用。因此,*
获得超过数组第一个字符的字符1字符。
printf("%p\n",str);
%p
说明符需要一个指针,就像%s
一样,但它会做其他事情。它不是打印字符串的内容,而是以十六进制格式打印指针所包含的地址。
printf("%d\n",*b);
这将打印int
指向的数组中的第一个b
。这相当于写b[0]
。
printf("%d",b);
b
是int *
,而不是int
,这是%d
所期望的。如果您尝试打印数组的第一个元素的地址,则说明符为%p
,而不是%d
。此外,此行不应生成编译器错误。相反,它应该是运行时未定义的行为,因为编译器不知道printf
格式字符串是什么。