我想知道这段代码内部发生了什么?

时间:2019-07-18 15:26:45

标签: c arrays pointers printf

我想知道这段代码的内部处理。

char arr[] = "cat";
*arr = 'b';
printf("%s",arr);

在此代码中,c如何覆盖数组中的b

Output : bat

1 个答案:

答案 0 :(得分:8)

如果有助于理解,*arr*(&arr[0]) 下面的注释相同,即,它指向存储在索引0处的值。

您只是在为其分配一个新值。

以图形方式:

char arr[] = "cat";

+-------+--------+--------+--------+     
|  c    |   a    |   t    |   \0   |             
+-------+--------+--------+--------+
  arr[0]  arr[1]   arr[2]   arr[3]

然后,

之后
*arr = 'b';   // which is practically same as arr[0] = 'b';

+-------+--------+--------+--------+   
|  b    |   a    |   t    |   \0   |             
+-------+--------+--------+--------+
  arr[0]  arr[1]   arr[2]   arr[3]

注意:

引用C11,第6.3.2.1章

  

除非它是sizeof运算符,_Alignof运算符或   一元&运算符,或者是用于初始化数组的字符串文字,该表达式具有   类型“类型数组” 转换为类型为“类型指针” 的表达式   数组对象的初始元素,不是左值。 [...]