C语言数组名是不可做指针运算的常量指针,为何下述程序可正常运行?
两种场景表现不一致的根本原因
两种场景下变量a的类型存在本质差异,这是C语言的明确语法规则决定的:
- 定义在
check函数内的char a[10]是数组类型:数组名是指向数组首元素的常量指针右值,不属于可修改的左值,不支持a++这类修改自身地址的操作,因此直接在check内写a++会触发「需要左值」的编译错误。 - 声明为
f函数形参的char a[],会被C编译器自动隐式转换为char *a指针类型:这个a是独立存储在f函数栈帧上的普通指针变量,属于可修改的左值,完全支持a++这类修改指针指向的操作。
当你调用f(a)时,check里的数组名a确实会隐式退化为指针,把数组首元素的地址赋值给f的形参a。你在f内修改的只是这个栈上的指针副本,和check里的原数组名没有关联,自然不会报错。a++后指针从指向a[0]偏移到指向a[1],解引用输出b完全符合逻辑。
内容的提问来源于stack exchange,提问作者Pawan Nirpal
相关产品推荐
相关产品推荐

