C 使用指针存储字符串

C 使用指针存储字符串,c,arrays,pointers,C,Arrays,Pointers,我开始学习C语言中的指针。直到我遇到“使用指针存储字符数组”这个主题,我才对它有了很好的理解。 下面是一个强调我的疑问的示例程序 #include <stdio.h> main() { char *string; string = "good"; printf ("%s", string); } #包括 main() { 字符*字符串; string=“good”; printf(“%s”,字符串); } 这将打印字符串,即good 指针应该存储内存地址,或者换句话

我开始学习C语言中的指针。直到我遇到“使用指针存储字符数组”这个主题,我才对它有了很好的理解。 下面是一个强调我的疑问的示例程序

#include <stdio.h>
main()
{
  char *string;
  string = "good"; 
  printf ("%s", string);
}
#包括
main()
{
字符*字符串;
string=“good”;
printf(“%s”,字符串);
}
这将打印字符串,即good

指针应该存储内存地址,或者换句话说,我们将变量的地址(使用地址运算符)分配给指针变量。 我不明白的是,我们如何能够将字符串直接分配给指针?也没有地址接线员吗?
另外,我们如何在没有间接运算符(*)的情况下打印字符串

“good”
这样的文本字符串实际上存储为(只读)字符数组。此外,C中的所有字符串必须以特殊的“null”字符
'\0'
终止

当你做助理的时候

string = "good";
真正发生的是使
字符串
指向该数组中的第一个字符

处理字符串的函数知道如何处理这样的指针,并且知道如何使用指针在这样的数组上循环以查找字符串中的所有字符,直到找到终止符为止


从另一个角度看,编译器创建了它的数组

char internal_array[] = { 'g', 'o', 'o', 'd', '\0' };
然后使
string
指向数组中的第一个元素

string = &internal_array[0];

请注意,
&internal\u array[0]
实际上等于
internal\u array
,因为数组自然会衰减为指向其第一个元素的指针。

“good”
这样的文本字符串实际上存储为(只读)字符数组。此外,C中的所有字符串必须以特殊的“null”字符
'\0'
终止

当你做助理的时候

string = "good";
真正发生的是使
字符串
指向该数组中的第一个字符

处理字符串的函数知道如何处理这样的指针,并且知道如何使用指针在这样的数组上循环以查找字符串中的所有字符,直到找到终止符为止


从另一个角度看,编译器创建了它的数组

char internal_array[] = { 'g', 'o', 'o', 'd', '\0' };
然后使
string
指向数组中的第一个元素

string = &internal_array[0];
请注意,
&internal\u array[0]
实际上等于
internal\u array
,因为数组自然衰减为指向其第一个元素的指针。
“cccccc”
是一个字符串文字,实际上是存储在只读内存中的字符数组。将指针指定给该文本的第一个字符的地址

如果要将字符串文字复制到RAM,需要:

char string[] = "fgdfdfgdfgf";
请记住,数组初始化(声明时)是唯一可以使用
=
将字符串文本复制到字符数组(字符串)的地方

例如,在任何其他情况下,您都需要使用适当的库函数

 strcpy(string, "asdf");
(字符串必须有足够的空间来容纳新字符串)

“cccccc”
是一个字符串文字,实际上是存储在只读内存中的字符数组。将指针指定给该文本的第一个字符的地址

如果要将字符串文字复制到RAM,需要:

char string[] = "fgdfdfgdfgf";
请记住,数组初始化(声明时)是唯一可以使用
=
将字符串文本复制到字符数组(字符串)的地方

例如,在任何其他情况下,您都需要使用适当的库函数

 strcpy(string, "asdf");

字符串
必须有足够的空间容纳新字符串)

您的第一个问题:
我不明白的是,我们如何能够将字符串直接分配给指针?没有地址接线员也可以吗?

字符串文字是包含在双引号中的零个或多个多字节字符的序列,例如“good”

来自C标准#6.4.5[字符串文字]:

…然后使用多字节字符序列初始化静态存储持续时间和长度刚好足以包含序列的数组。对于字符串文本,数组元素的类型为char,并用多字节字符序列的各个字节初始化

在C语言中,将类型为数组类型为的表达式转换为类型为指针指向类型的表达式,该类型指向数组对象的初始元素[很少有例外]。因此,作为数组的字符串文字将衰减为指针,指针可以分配给类型
char*

在声明中:

string = "good";
string
将指向数组中存储
“good”
的初始字符

你的第二个问题:
另外,我们如何在没有间接运算符(*)的情况下打印字符串?

s
写入字符串
参数必须是指向字符数组初始元素的指针


因此,格式说明符
%s
期望指向初始元素的指针,该元素就是变量
字符串
的内容-指向
“good”
的初始字符的指针。因此,您不需要间接运算符(*)。

您的第一个问题:
我不明白的是,我们如何能够将字符串直接分配给指针?没有地址接线员也可以吗?

字符串文字是包含在双引号中的零个或多个多字节字符的序列,例如“good”

来自C标准#6.4.5[字符串文字]:

…然后使用多字节字符序列初始化静态存储持续时间的数组