我是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/

10-12 14:10
查看更多