Lin*_*oob 2 c string variables
我最近开始尝试学习C编程语言.在我的第一个程序(简单的hello world事物)中,在我意识到我不能这样做之后,我遇到了声明字符串的不同方法variable_name = "string data":
char *variable_name = "data"
char variable_name[] = "data"
char variable_name[5] = "data"
Run Code Online (Sandbox Code Playgroud)
我不明白的是它们之间的区别.我知道它们是不同的,其中一个专门分配了一定数量的内存来存储数据,但这就是它,我觉得我需要在C中转移到更复杂的概念之前理解这一点.
此外,为什么使用*variable_name让我重新分配变量名到一个新的字符串,但variable_name[number]还是variable_name[]没有?当然,如果我给它分配10个字节(char variable_name[10] = "data")并尝试将其重新分配给10字节或更小的东西它应该工作,那么为什么不呢?
什么是空括号和星号?
在这个宣言中
char *variable_name = "data";
Run Code Online (Sandbox Code Playgroud)
声明了一个指针.该指针指向字符串文字"data"的第一个字符.编译器将字符串文字放在某个内存区域中,并通过文字的第一个字符的地址指定指针.
您可以重新分配指针.例如
char *variable_name = "data";
char c = 'A';
variable_name = &c;
Run Code Online (Sandbox Code Playgroud)
但是,您可能无法更改字符串文字本身.尝试更改字符串文字会导致程序的未定义行为.
在这些声明中
char variable_name[] = "data";
char variable_name[5] = "data";
Run Code Online (Sandbox Code Playgroud)
声明了两个数组元素,这些元素由用于初始化字符串文字的字符初始化.例如这个声明
char variable_name[] = "data";
Run Code Online (Sandbox Code Playgroud)
相当于以下内容
char variable_name[] = { 'd', 'a', 't', 'a', '\0' };
Run Code Online (Sandbox Code Playgroud)
该数组将有5个元素.因此,该声明完全符合声明的要求
char variable_name[5] = "data";
Run Code Online (Sandbox Code Playgroud)
如果要指定其他大小的数组,则会有所不同.例如
char variable_name[7] = "data";
Run Code Online (Sandbox Code Playgroud)
在这种情况下,阵列将按以下方式初始化
char variable_name[7] = { 'd', 'a', 't', 'a', '\0', '\0', '\0' };
Run Code Online (Sandbox Code Playgroud)
也就是说,没有显式初始化器的数组的所有元素都是零初始化的.
注意在C中你可以用以下方式使用字符串文字声明一个字符数组
char variable_name[4] = "data";
Run Code Online (Sandbox Code Playgroud)
这是字符串文字的终止零没有放在数组中.在C++中,这样的声明无效.
当然,如果需要,您可以更改数组的元素(如果它未定义为常量数组).
考虑到您可以将用作初始化器的字符串文字括在大括号中.例如
char variable_name[5] = { "data" };
Run Code Online (Sandbox Code Playgroud)
在C99中,您还可以使用所谓的目标初始值设定项.例如
char variable_name[] = { [4] = 'A', [5] = '\0' };
Run Code Online (Sandbox Code Playgroud)
这是一个示范计划
#include <stdio.h>
#include <string.h>
int main(void)
{
char variable_name[] = { [4] = 'A', [5] = '\0' };
printf( "%zu\n", sizeof( variable_name ) );
printf( "%zu\n", strlen( variable_name ) );
return 0;
}
Run Code Online (Sandbox Code Playgroud)
程序输出是
6
0
Run Code Online (Sandbox Code Playgroud)
当ypu应用strlen在头文件中声明的标准C函数时,<string.h>你得到它返回0,因为在索引为4的元素之前的数组的第一个元素是零初始化的.
| 归档时间: |
|
| 查看次数: |
89 次 |
| 最近记录: |