这个二维数组通过测试失败了吗?

时间:2014-10-04 20:53:40

标签: c parameter-passing

#include<stdio.h>

void test(int *TESTarr,int M,int N){
    printf("%ld\n",(long)TESTarr);
    printf("%ld\n\n",(long)*(TESTarr+5));
    //printf("%d\n",*(marr+1*N+2));
}
int main(){
    int myarr[5][3]={1,2,3,4,5,6,7,8,0,10,11,12,13,14,15};
    int i,j;
    test(myarr,5,3);
    printf("%ld\n",(long)myarr);
    printf("%ld\n",(long)*(myarr+5));
}

这是一个测试二维数组传递函数的实验。 printf(“%d \ n”,TESTarr)将打印TESTarr的地址。

但为什么我在这里得到一个结果?我的意思是为什么printf(“%d \ n \ n”,(TESTarr + 5))和printf(“%d \ n”,(myarr + 5))不输出相同的导致?

1733315152
6

1733315152
1733315212

2 个答案:

答案 0 :(得分:0)

如果你想传递2D数组,那么你应该只将它的基地址而不是myarr [0]传递给函数。传递myarr [0]与将*(myarr + 0)传递给函数是一样的,该函数是2D数组的第一个1D数组。现在如果我们再次取消引用TESTarr那么它将获得1D数组的元素,它是整数。现在*(TESTarr + 5)与TESTarr [5]相同,它将从基地址6开始获取第6个元素。

答案 1 :(得分:-1)

为什么值不相同的简单答案是myarr是一个由3个整数组成的数组,所以当你添加到它的指针时,你实际上是在添加sizeof(int)* 3 。 TESTarr只是一个整数数组,因此添加它会添加sizeof(int)。打印值不同,因为指针是不同的类型。

这是一个简化,但我建议阅读有关指针,数组以及它们之前链接的c-faq差异的更多信息。