繁体   English   中英

C - 分配指向数组的指针? 基于四个例子

[英]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
}
  • 参考1是正确的:pi指向arrayXYZ中的第一个元素 - > * pi = 0
  • 参考2是正确的:pi点递增的元素 - > * pi = 1
  • 参考文献3不正确: 我不完全确定原因。 每个整数都需要4位内存。 因此,我们不能只增加一个数组头部的地址? 假设,我们有一个char数组,其sizeof(char)= 1 - >数组的头部是否指向下一个桶?
  • 参考文献4不正确: 我不完全确定原因。 为什么数组的头部不能指向pi指向的地址?

谢谢你的所有澄清! 我是新成员,所以如果我的问题没有遵循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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM