[英]C - Assigning pointers to arrays? Based on four examples
假设以下代码:
#include <stdio.h>
#include <stdlib.h>
int main (int argc, char **argv)
{
int arrayXYZ[10];
int i;
int *pi;
int intVar;
for (i=0; i<10; i++){
arrayXYZ[i] = i;
}
pi = arrayXYZ; // Reference 1
pi++; // Reference 2
arrayXYZ++; // Reference 3
arrayXYZ = pi; // Reference 4
}
谢谢你的所有澄清! 我是新成员,所以如果我的问题没有遵循Stackoverflow指南,请随时告诉我如何改进我的下一个问题!
arrayXYZ++;
这相当于:
arrayXYZ += 1;
这相当于:
arrayXYZ = arrayXYZ + 1;
这是不允许的,因为C语言不允许它。 无法分配数组。
arrayXYZ = pi;
出于同样的原因,这也失败了。 无法分配数组。
其他分配有效,因为您可以分配给指针。
还要记住,数组和指针是不同的数据类型。 在C中,为了方便起见,有些情况下数组会衰减成指向其第一个元素的指针。 这就是为什么这个有效:
pi = arrayXYZ;
但是,这只是一个自动转换,因此您不必编写:
pi = &arrayXYZ[0];
这种自动转换并不意味着数组与指针相同。
从C11标准§ 6.3.2.1 (N1570)
左值是一个表达式(对象类型不是void)可能指定一个对象; 64)如果左值在评估时没有指定对象,则行为是未定义的。 当一个对象被称为具有特定类型时,该类型由用于指定该对象的左值指定。 可修改的左值是一个左值,它没有数组类型 ,没有不完整的类型,没有const限定类型,如果是结构或联合,则没有任何成员(包括递归地,任何成员)或具有常量类型的所有包含的聚合或联合的元素。
并且来自§6.5.2.4
后缀增量或减量运算符的操作数应具有原子,限定或非限定的实数或指针类型,并且应为可修改的左值 。
正如这里所指出的,这些是这些陈述是非法的原因。 对于赋值操作,左边的一个必须是可修改的。 这不是。 这就是问题所在。
现在解释为什么其他两个工作 - 有一个叫做数组衰减的东西。 大多数情况下的数组(在&
, sizeof
等的操作数中使用的异常)被转换为指向数组的第一个元素的指针,并且该指针被分配给pi
。 这是可以修改的。 这就是为什么你可以轻松地将++
应用于它。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.