c - 二维数组和指针

标签 c arrays pointers

int stud[5][2] = {{1,2},{3,4},{5,6},{7,8},{9,8}};
printf("%u %u",*(stud+1),stud+1);
printf("%u, %u", &stud,stud);

为什么这个语句打印出相似的值,stud[1] 或 *(stud+1) 实际上是一个数组因此必须得到基地址即 &stud[0][0],但 stud 本身是一个指向数组的指针大批。第三条语句也打印相同的值。

最佳答案

关于表达式都是地址结果,您的观察是正确的。但是根据标准,这些地址的类型是不同的。您的短语“但 stud 本身是指向数组数组的指针”。不准确。 stud 是一个数组的数组。指针不是数组。经过几十年的努力,想出一个描述它如何工作的坚实的白话,并坚定地拒绝走“衰变”木板(这个词在 C 标准中出现了一次次,甚至在那里它用作动词脚注),我能想到的最好的是:

Pointers are not arrays. A pointer holds an address. An array is an address.

每个表达式如下所示 Given int stud[5][2];

stud        int (*)[2]
stud+1      int (*)[2]
*(stud+1)   int *
&stud       int (*)[5][2]

请记住,根据标准,数组的表达值是其第一个元素的地址,元素类型指针是所述地址的类型。在两个输出中,每对表达式都有相同的地址,但它们是不同的类型。这可以通过对原始代码进行一些扩展来验证:

#include <stdio.h>

int main()
{
    int stud[5][2] = {{1,2},{3,4},{5,6},{7,8},{9,8}};
    printf("%p %p\n", *(stud+1), stud+1);
    printf("%p %p\n", &stud,stud);

    int (*p1)[2] = stud+1;         // OK
    // int (*p2)[2] = *(stud+1);   // incompatible types
    int *p3 = *(stud+1);           // OK
    int (*p4)[5][2] = &stud;       // OK

    return 0;
}

关于c - 二维数组和指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23840904/

相关文章:

c++ - 在 C++ 中创建数量不断变化的指针

python - 无法正确安装 rpy2

c# - 如何反转 int 的字节顺序?

c++ - 保存数组地址的指针地址如何相同?

在 C 中从整数数组创建字符串数组

c++ - 用随机值填充我的数组 C++

c - *(int*)变量是什么意思?

c - 如何使该代码算法高效?使用该算法后的代码将是什么?如何避免该程序超出时间限制?

c - 使用指针保存从c中函数返回的数据

c - 这个简单的 C 程序的输出很难理解