Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/variables/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C什么时候决定char[]是字符数组还是字符串?_C_Variables - Fatal编程技术网

C什么时候决定char[]是字符数组还是字符串?

C什么时候决定char[]是字符数组还是字符串?,c,variables,C,Variables,char[i]代表一个变量的声明,包括char数组和字符串。我知道如果是字符串,C会在数组的末尾添加一个空字符。然而,C如何知道何时添加空字符,换句话说,在哪个阶段 事实并非如此,C“字符串”只是关于数组的一种假设(它们在某处有一个0表示字符串的结尾) C中没有类型“string”,只有处理具有上述假设的字符数组的库。完全由库函数来管理阵列,并根据需要确定何时终止阵列。通常,这些函数并不考虑实际为数组分配了什么内存,它会假定有足够的分配空间用于执行任何操作 如果愿意,完全可以在C中使用pasca

char[i]代表一个变量的声明,包括char数组和字符串。我知道如果是字符串,C会在数组的末尾添加一个空字符。然而,C如何知道何时添加空字符,换句话说,在哪个阶段

事实并非如此,C“字符串”只是关于数组的一种假设(它们在某处有一个0表示字符串的结尾)

C中没有类型“string”,只有处理具有上述假设的字符数组的库。完全由库函数来管理阵列,并根据需要确定何时终止阵列。通常,这些函数并不考虑实际为数组分配了什么内存,它会假定有足够的分配空间用于执行任何操作

如果愿意,完全可以在C中使用pascal类型的字符串并使用该约定编写字符串库。

事实并非如此,C“字符串”只是关于数组的一种假设(它们在某个地方有一个0表示字符串的结尾)

C中没有类型“string”,只有处理具有上述假设的字符数组的库。完全由库函数来管理阵列,并根据需要确定何时终止阵列。通常,这些函数并不考虑实际为数组分配了什么内存,它会假定有足够的分配空间用于执行任何操作


如果愿意,完全可以在C中使用pascal类型的字符串并使用该约定编写字符串库。

C不知道
char[]
char*
是字符串,而
char[]
char*
不是字符串之间的区别

C将添加nul终止符的唯一位置是使用字符串文字时

const char x[] = "Hello, world!";
//                             ^ plus terminator, sizeof=14
const char *y = "Hello, world!";
//                            ^ plus terminator
不使用终止符也可以轻松创建阵列:

const char x[] = {'H', 'e', 'l', 'l', 'o', ',',
                  ' ', 'w', 'o', 'r', 'l', 'd', '!'};
//                                                 ^ NO terminator
//                                                 sizeof=13
好吧,也许不是“那么容易”,这是一个相当多的额外键入。但是您可以看到要点:事实上,您使用了双引号
“…”
,添加了nul终止符


某些库函数也会提供nul终止符,如
strcpy
snprintf
C不知道
char[]
char*
是字符串还是
char[]
char*
不是字符串之间的区别

C将添加nul终止符的唯一位置是使用字符串文字时

const char x[] = "Hello, world!";
//                             ^ plus terminator, sizeof=14
const char *y = "Hello, world!";
//                            ^ plus terminator
不使用终止符也可以轻松创建阵列:

const char x[] = {'H', 'e', 'l', 'l', 'o', ',',
                  ' ', 'w', 'o', 'r', 'l', 'd', '!'};
//                                                 ^ NO terminator
//                                                 sizeof=13
好吧,也许不是“那么容易”,这是一个相当多的额外键入。但是您可以看到要点:事实上,您使用了双引号
“…”
,添加了nul终止符


某些库函数还将为您提供nul终止符,如
strcpy
snprintf

当某人或某物添加空字节时,字符数组将变成字符串。如果使用初始化,编译器将添加空字节。如果使用strcpy(),函数将添加空字节。如果使用
strncpy()
,函数可能会或可能不会添加空字节,结果可能会或可能不会是字符串-这取决于具体情况。C不会在数组的末尾添加空字符。C只会在字符串文字的末尾添加空字符,这使得
“Hellow world\n”
成为字符序列
{'H','e','l','l','o','w','o','r','l','d','\n','\0'}
但没有其他内容。字符串操作函数假定(其中一些函数,例如
strlen(3)
)字符串以null结尾,但这是库实现约定,而不是语言定义。当某人或某事添加null字节时,字符数组将成为字符串。如果使用初始化,编译器将添加null字节。如果使用
strcpy()
,函数将添加null字节。如果使用
strncpy()
,函数可能添加或不添加空字节,结果可能是字符串,也可能不是字符串-这取决于情况。C不向数组末尾添加空字符。C只在字符串文本末尾添加空字符,这使得
“Hellow world\n”
成为字符序列
{'H','e','l','l','o','w','o','r','l','d','\n','\0'}
除此之外没有其他内容。字符串操作函数假定(其中一些函数,例如
strlen(3)
)字符串以null结尾,但这是库实现约定,而不是语言定义。