字符串(c语言):
以“abcd”为例,解释如下:
1. 申请了空间(在常量区),存放了字符串
2. 在字符串尾加上了'/0'
3. 返回地址
一定记清楚!!
1. 字符串赋值给char *
int main(int argc, const char *argv[])
{
char *p1 = "hello";
printf("p1[0] = %c\n", *p1);
printf("%s\n", p1);
char *p2 = NULL;
p2 = "world";
printf("p2[0] = %c\n", *p2);
printf("%s\n", p2);
return 0;
}
小结:以下两种形式赋值效果相同
char *p1 = "hello";
与
char *p2 = NULL;
p2 = "world";
2. 字符串赋值给数组
1) 字符串赋值给定长数组
int main(int argc, const char *argv[])
{
char p1[10] = "hello";
printf("%s", p1);
return 0;
}
/* 结果输出:
hello
*/
int main(int argc, const char *argv[])
{
char p2[10];
p2 = "hello";
return 0;
}
/*
../src/demon.c: In function 'main':
../src/demon.c:46:8: error: assignment to expression with array type
46 | p2 = "hello";
| ^
../src/demon.c:45:10: warning: variable 'p2' set but not used [-Wunused-but-set-variable]
45 | char p2[10];
| ^~
*/
小结:以下两种形式不同。
char p1[10] = "hello";
与
char p2[10];
p2 = "hello";
对于第二种形式的理解: “hello”赋值的值是一个地址,p2是一个常量地址却。因此不能将字符串的地址赋值给一个常量。
2)字符串赋值给未知长度数组
int main(int argc, const char *argv[])
{
char p[] = "hello";
printf("%s", p);
printf("sizeof(p[]) = %d", (int)sizeof(p));
return 0;
}
/*结果输出:
> Executing task: .\bin\demon.exe <
hello
sizeof(p[]) = 6
终端将被任务重用,按任意键关闭。
*/
char str[] = "hello"; 因为定义的是一个字符数组,所以就相当于定义了一些空间来存放"hello",而又因为字符数组就是把字符一个一个地存放的,所以编译器把这个语句解析为 char str[6] = {'h','e','l','l','o','\0'};
小结:字符串赋值给不定长度的数组时,sizeof数组计算出来的长度结果中是包含‘\0’的。