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

And*_*ing 5 c arrays pointers

假设以下代码:

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

谢谢你的所有澄清!我是新成员,所以如果我的问题没有遵循Stackoverflow指南,请随时告诉我如何改进我的下一个问题!

Nik*_* C. 5

arrayXYZ++;
Run Code Online (Sandbox Code Playgroud)

这相当于:

arrayXYZ += 1;
Run Code Online (Sandbox Code Playgroud)

这相当于:

arrayXYZ = arrayXYZ + 1;
Run Code Online (Sandbox Code Playgroud)

这是不允许的,因为C语言不允许它.无法分配数组.

arrayXYZ = pi;
Run Code Online (Sandbox Code Playgroud)

出于同样的原因,这也失败了.无法分配数组.

其他分配有效,因为您可以分配给指针.

还要记住,数组和指针是不同的数据类型.在C中,为了方便起见,有些情况下数组会衰减成指向其第一个元素的指针.这就是为什么这个有效:

pi = arrayXYZ;
Run Code Online (Sandbox Code Playgroud)

但是,这只是一个自动转换,因此您不必编写:

pi = &arrayXYZ[0];
Run Code Online (Sandbox Code Playgroud)

这种自动转换并不意味着数组与指针相同.