我是C编程新手,目前正在学习数组和字符串。我对这个话题很困惑。来问我的问题-
由于数组(对于ex-a[]={20,44,4,8}
),表达式中的名称会衰减为指针常量,因此每当我尝试执行指针算术(例如-a=a+1
或类似的操作)时,编译器都会显示错误,但当我在printf()函数中编写的相同操作时,它会显示第一个元素的地址,而不是显示错误。为什么?
在一个表达式中,例如*(a+1)=2
首先(a+1)
将被求值,然后*
将取消对它的引用。我的问题是,如果a
是指针常量,那么它如何指向数组中的任何其他内存位置,以及这个表达式是如何完全合法的?
我试着找这个,但找不到准确的结果。
最佳答案
尽管在某些表达式中数组名的计算结果为指针,但您的a = a+1
赋值尝试赋值给数组,这是不允许的。
另一方面,a+1
表达式是允许的,它的计算结果是另一个指针。当您将此值传递给printf
时,函数会很高兴地打印它。打印时不要忘记将结果转换为void*
:
printf("%p\n", (void*)(a+1));
如果
a
是一个指针常量,那么它如何指向数组中的任何其他内存位置,以及*(a+1)
表达式如何完全合法?出于同样的原因,两个常数的组合
2+3
产生的值既不是2也不是3。在您的示例中,a+1
表达式不会修改a
。相反,表达式使用它作为“起点”,计算一个不同的值(恰好是指针类型),并保持a
不变。关于c - 为什么编译器未在使用指针之类的数组的表达式上显示错误?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/27485203/