我正在学习C,我遇到了指针。 尽管我在本教程中学到的东西比从教科书中学到的更多,但我仍然对奇数指针感到疑惑。
如果我编程
#include <stdio.h>
int main()
{
char *ptr_str;
ptr_str = "Hello World";
printf(ptr_str);
return 0;
}
结果是
Hello World
由于指针ptr_str直接指向文本而不指向文本的第一个字符,因此我不了解编译时是否存在错误。我以为这只会有效
#include <stdio.h>
int main()
{
char *ptr_str;
char var_str[] = "Hello World";
ptr_str = var_str;
printf(ptr_str);
return 0;
}
所以在第一个例子中我是如何直接指向文本的?
答案 0 :(得分:5)
您的代码有效,因为字符串文字本质上是静态数组。
ptr_str = "Hello World";
被编译器视为
static char __tmp_0[] = {'H', 'e', 'l', 'l', 'o', ' ', 'W', 'o', 'r', 'l', 'd', '\0' };
ptr_str = __tmp_0;
(除了尝试修改字符串文字的内容有未定义的行为)。
您甚至可以将sizeof
应用于字符串文字,然后您将获得数组的大小:例如,sizeof "Hello"
为6。
答案 1 :(得分:0)
在赋值给char指针的上下文中,&#39;值&#39;字符串文字的第一个字符的地址。
所以
ptr_str = "Hello World";
将ptr_str设置为&#39; H&#39;
的地址答案 2 :(得分:0)
为什么第一个不起作用?它会像你看到的一样工作。
字符串文字是数组。来自§6.4.5p6 C11
标准N1570
然后使用多字节字符序列初始化一个静态存储持续时间和长度的数组,该数组足以包含该序列。对于字符串文字,数组元素的类型为char,并使用多字节字符序列的各个字节进行初始化。
现在在第一种情况下 literal array decayed into pointer to first element - 所以腐朽的指针基本上会指向'H'
。您已将该指针指定给ptr_str
。现在printf
将期望格式说明符和相应的参数。这里它将是%s
,相应的参数将是char*
。并且printf
将打印每个字符,直到它到达\0
。这就是它发生的一切。这就是你直接指向文本的方式。
请注意,第二种情况与第一种情况完全不同 - 第二种情况是正在制作可以修改的副本(尝试修改第一种情况将是未定义的行为)。我们basically initializing a char
array包含字符串文字的内容。