定义并索引到二维数组-C

定义并索引到二维数组-C,c,C,如果我定义一个数组,比如static double a[100]那么我以后可以像这样索引到它吗a[1][1]?我想,如果我想要一个二维数组,我需要像static double a[100][100]那样定义它 如果我定义一个数组,比如static double a[100];那么我可以索引到 它以后会像这样一个[1][1] 没有。。你不能。这只是一个一维数组a[1][1]将随机访问一些内存,导致未定义的行为,因此将在编译时作为错误报告 是的,您可以拥有一个二维数组a[100][100]并访问a[

如果我定义一个数组,比如
static double a[100]
那么我以后可以像这样索引到它吗
a[1][1]
?我想,如果我想要一个二维数组,我需要像
static double a[100][100]那样定义它

如果我定义一个数组,比如static double a[100];那么我可以索引到 它以后会像这样一个[1][1]

没有。。你不能。这只是一个一维数组a[1][1]将随机访问一些内存,导致未定义的行为,因此将在编译时作为错误报告


是的,您可以拥有一个二维数组
a[100][100]
并访问
a[1][1]

您不能简单地将一维数组变成二维数组。但是,您可以创建一个类似
int a[100][100]
的数组,并通过提供它们的位置(例如
int b=a[x][y]
来访问数组中的值,其中x和y是一些从0到99的数字。

由于类型不匹配,因此不能直接访问。
a[1][1]
相当于:

(*(*(a+1)+1)
因为您的数组定义为
静态双a[100],第二次(外部)取消引用完全无效

然而,我相信您可以创建一个指针,在其中模拟二维数组。以下是概念证明,以获得想法:

#include <stdio.h>

int main(void)
{
    static double a[100];

    for (int i = 0; i < 100; i++)
        a[i] = i;

    double (*p_a)[10] = (double(*)[10]) a;

    printf("%f\n", a[55]);
    printf("%f\n", p_a[5][5]); // evaluated as 5 * 10 + 5

    return 0;
}
#包括
内部主(空)
{
静态双a[100];
对于(int i=0;i<100;i++)
a[i]=i;
双(*p_a)[10]=(双(*)a[10]);
printf(“%f\n”,a[55]);
printf(“%f\n”,p_a[5][5]);//计算为5*10+5
返回0;
}

我不知道这是否完全符合C标准,你一定要小心不要越界。尽管如此,将
100
元素一维数组视为与相同类型的
10x10
二维数组同构似乎是合理的。从本质上讲,这两种方法都保证具有相同的内存布局。这是因为二维数组是连续“按行”排列的(即第一行、第二行、最后一行)。

a[1][1]
是编译时错误,如果a声明为
静态双a[100]
@mch谢谢我把它添加到了答案中为什么应该允许它?你为什么不自己试试呢?一些从0到100的数字是不正确的。100美元是不允许的