为什么数组变量不能赋值字符串常量
好几年不碰C语言了,遇到了个很初级的问题居然一时间懵了,记录一下。
- 1
char msg_array[10];
msg_array = "hello world";
printf("msg_array = %s\n",msg_array);
- 1
- 2
- 3
大家都知道这种写法是错误的,但是为什么是错的呢?
在《c与指针》这本书里就提到过:
字符串常量的直接值是一个指针,而不是这些字符本身。
而我们都知道数组名本身就是一个指针,且其指向的地址是不可以改变的。
所以c=“hello”; 这条赋值语句就相当于在改变数组的地址常量,这显然是错误的。
这里还有个问题,在数组变量初始化时是可以成功赋值字符串变量的:
char mess_array[10]="hello";
printf("msg_array = %s\n",msg_array );
- 1
- 2
打印一下地址值:
printf("string:%p\n", "hello world");
char msg_array [10]="hello";
printf("msg_array :%p\n", msg_array );
return 0;
- 1
- 2
- 3
- 4
结果:
string :0000000000404000
mess_array:000000000062FE00
- 1
- 2
可见,并不是字符串常量把地址赋给了数组。 问了一下别人说是编译器的问题,编译器在初始化时做了很多内部工作。
初始化后数组内的字符实际上已经和字符串常量"hello"没什么关系了。
同时也看一下指针:
char *ptr;
printf("ptr:%p\n", ptr);
ptr = “hello world”;
printf(“ptr_new:%p\n”, ptr);
char *ptr2 = “hello world”;
printf(“ptr2:%p\n”, ptr2);
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
结果:
ptr :0000000000000001
ptr_new :0000000000404000
ptr2 :0000000000404000
- 1
- 2
- 3
可见无论是初始化还是赋值,指针都会指向字符常量的地址。
注意:数组名指向的地址是不可改变的,而普通的指针变量可以变。
谁要有更好的解释还请不吝赐教🙏。。