C语言字符串赋值给数组/char *

C语言字符串赋值给数组/char *

字符串(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’的。