c – 当我将二维数组作为一维数组读取时显示的内容是什么?

我试图理解C处理数组的方式,在这种情况下,通过读取二维数组就好像它是一维数组一样.

鉴于这个简单的C程序

#include <stdio.h>

int main(int argc,char *argv[]){

    int array[4][4];
    int i,j;

    for(i = 0; i < 4; i++){
        for(j = 0; j < 4; j++){
            array[i][j] = (i+1)*(j+1);
            printf("%d ",array[i][j]);
        }
        printf("\n");
    }

    for(i = 0; i < 16; i++){
        printf("%d ",array[i]);    
    }

    printf("\n");

}

我得到了这个奇怪的输出.

1 2 3 4 
2 4 6 8 
3 6 9 12 
4 8 12 16 
56319776 56319792 56319808 56319824 56319840 56319856 56319872 56319888 56319904 56319920 56319936 56319952 56319968 56319984 56320000 56320016

在第二个for循环中打印的是什么?

解决方法

What is being printed in the second for loop?

简短的回答是“它是垃圾”.它的正式名称是“未定义的行为”,但它实际上是一个任意十进制数字的序列.

长答案有点棘手:你传递的是一维数组的printf地址,它被重新解释为整数.请注意数字是如何分开16的相同步骤.这是系统上四个整数的大小.

如果你想通过一个维度的数组得到原始数字,你可以强制对数组进行不同的重新解释 – 作为指向int的指针:

int *ptr = (int*)&array;
for(i = 0; i < 16; i++){
    printf("%d ",ptr[i]);
}

这将生成2D数组中的数字序列,即数组存储在内存中的方式(逐行).

Demo on ideone.

相关文章

本程序的编译和运行环境如下(如果有运行方面的问题欢迎在评...
水了一学期的院选修,万万没想到期末考试还有比较硬核的编程...
补充一下,先前文章末尾给出的下载链接的完整代码含有部分C&...
思路如标题所说采用模N取余法,难点是这个除法过程如何实现。...
本篇博客有更新!!!更新后效果图如下: 文章末尾的完整代码...
刚开始学习模块化程序设计时,估计大家都被形参和实参搞迷糊...