为什么数组变量不能赋值字符串常量

本文探讨了C语言中数组与字符串常量的关系,解释了为什么不能直接将字符串常量赋值给数组,以及数组在初始化时如何能赋值字符串。通过代码示例展示了数组和指针在处理字符串常量时的不同行为,强调了数组名的不可变性以及编译器在初始化时的作用。
摘要由CSDN通过智能技术生成

为什么数组变量不能赋值字符串常量

好几年不碰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

可见无论是初始化还是赋值,指针都会指向字符常量的地址。

注意:数组名指向的地址是不可改变的,而普通的指针变量可以变。

谁要有更好的解释还请不吝赐教🙏。。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值