首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >指针和多维数组

指针和多维数组
EN

Stack Overflow用户
提问于 2014-04-23 21:31:07
回答 4查看 95关注 0票数 0

我想打印包含在多维数组中的值,我知道如果我们写像arr[3][4]这样的东西,那么arr[0]就是指向那个多维数组中第一个元素的指针。我想问一下,为什么在程序打印多维数组中包含的数字后,这段代码会给我无用的值?

代码如下:

代码语言:javascript
复制
    #include <stdio.h>

    #define ROW 3
    #define COLL 4

    int main(void) {
    int arr[ROW][COLL]={{1,2,3,4},
                  {5,6,7,8},
                  {9,10,11,12}};
    int *ptr;

    for(ptr=arr[0];ptr<arr[ROW]+COLL;ptr++){
        printf("%d ",*ptr);
    }
    printf("\n");
    return 0;
    }

这是我编译上述代码时的结果:

代码语言:javascript
复制
1 2 3 4 5 6 7 8 9 10 11 12 -1079481492 134513936 0 -1079481352 

但在将for循环更改为以下内容之后:

代码语言:javascript
复制
for(ptr=arr[0];ptr<=arr[ROW-1]+COLL-1;ptr++)

代码工作并给出包含在多维数组中的确切数字。

EN

回答 4

Stack Overflow用户

发布于 2014-04-23 21:36:53

因为arr[ROW]是一种越界访问。arr中的最后一个有效位置是arr[ROW-1]。因此,代码的第一个版本会调用未定义的行为。

票数 2
EN

Stack Overflow用户

发布于 2014-04-23 21:38:59

指向最后一个元素的指针是

代码语言:javascript
复制
arr[ROW-1] + COLL - 1

所以你的循环应该是

代码语言:javascript
复制
    for (ptr = arr; ptr < arr[ROW-1] + COLL; ptr++) {
票数 0
EN

Stack Overflow用户

发布于 2014-04-23 22:27:19

数组的元素是从0开始索引的,所以矩阵中的最后一个元素是arr[ROW-1][COLL-1]

当指针到达arr[2] + COLL时,就没有这样的元素了,因为最后一行的最后一个元素的第二个坐标是[COLL-1]

数组的元素存储在1D中,因此arr[0] + 4实际上是arr[1][0]。当您递增ptr++时,它会告诉编译器访问当前之后的下一个内存位置。所以,当ptr指向a[0] + 4时,它是有效的,因为编译器访问了a[0][0]之后的第五个值,这实际上是下一行的第一个值,arr[1][0],因为它们的内存位置是相邻的。

当您的ptr指向arr[4] + i, i = 0, 1, 2, 3时,您会得到错误的输出,因为这些元素不在您的数组中。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23245921

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档