我想知道这段代码的内部处理。
char arr[] = "cat";
*arr = 'b';
printf("%s",arr);
在此代码中,c
如何覆盖数组中的b
?
Output : bat
答案 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
运算符或 一元&
运算符,或者是用于初始化数组的字符串文字,该表达式具有 类型“类型数组” 转换为类型为“类型指针” 的表达式 数组对象的初始元素,不是左值。 [...]