C/C++ 有关二维数组的问题

L77'bagabaga 2021-01-02 09:29:27
大佬们看看。我这样写,为什么会出错
...全文
434 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
源代码大师 2021-05-06
  • 打赏
  • 举报
回复
希望对你有帮助:https://blog.csdn.net/it_xiangqiang/category_10581430.html 希望对你有帮助:https://blog.csdn.net/it_xiangqiang/category_10768339.html
  • 打赏
  • 举报
回复
sum+=(*a)[i]改成 sum+=a[i]或sum+=*(a+i)
  • 打赏
  • 举报
回复
必须得错啊,谁让你得罪人
赵4老师 2021-01-06
  • 打赏
  • 举报
回复
仅供参考:
#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
#include <typeinfo.h>
int main() {
    int sa[3][4];
    int **db;
    int j,k;

    for (j=0;j<3;j++) {
        for (k=0;k<4;k++) {
            sa[j][k]=j*10+k;
        }
    }

    for (j=0;j<3;j++) {
        for (k=0;k<4;k++) {
            printf(" %3d",sa[j][k]);
        }
        printf("\n");
    }

    printf("typeid(sa[0]   ).name() is %s\n",typeid(sa[0]   ).name());
    printf("typeid(sa      ).name() is %s\n",typeid(sa      ).name());
    printf("\n");

    db=(int **)malloc(3*sizeof(int *));
    if (NULL==db) return 1;
    for (j=0;j<3;j++) {
        db[j]=(int *)malloc(4*sizeof(int));
        if (NULL==db[j]) return 1;
    }
    for (j=0;j<3;j++) {
        for (k=0;k<4;k++) {
            db[j][k]=j*10+k;
        }
    }

    for (j=0;j<3;j++) {
        for (k=0;k<4;k++) {
            printf(" %3d",db[j][k]);
        }
        printf("\n");
    }

    printf("typeid(db[0]   ).name() is %s\n",typeid(db[0]   ).name());
    printf("typeid(db      ).name() is %s\n",typeid(db      ).name());
    printf("\n");

    for (j=0;j<3;j++) {
        free(db[j]);
    }
    free(db);

    return 0;
}
//   0   1   2   3
//  10  11  12  13
//  20  21  22  23
//typeid(sa[0]   ).name() is int [4]
//typeid(sa      ).name() is int [3][4]
//
//   0   1   2   3
//  10  11  12  13
//  20  21  22  23
//typeid(db[0]   ).name() is int *
//typeid(db      ).name() is int * *
//
//
forever74 2021-01-05
  • 打赏
  • 举报
回复
以下描述仅作阐述,无意批评。这种误解我当初也干过: 主函数里做实参的部分由于其作用就是求值,就算是语法不严谨什么的都不影响结果,因为实参传递给形参的仅仅是值,没有类型信息。当然,这个值是个地址。 然而函数里面由于形参列表的声明,会把传递过来的内容解读做int **类型,所以循环里面的(*a)会被解读为int*类型,也就是地址。但是*a是1呀(这里才是int**类型和int(*)[4]类型的本质区别),于是去访问地址1了。集 段错误和总线错误 于一体,估计哪个操作系统也忍受不了这个。
maguangzhi 2021-01-05
  • 打赏
  • 举报
回复
此问题的关键在于sizeof(void *)是否等于sizeof(int),若是结果碰巧会对,即编译结果是不是32位即Ⅹ86模式。
自信男孩 2021-01-05
  • 打赏
  • 举报
回复
形参应该用int *a即一重指针。实参用&sum[0][0]
L77'bagabaga 2021-01-04
  • 打赏
  • 举报
回复
谢谢各位大佬,我悟了
ctrigger 2021-01-02
  • 打赏
  • 举报
回复
引用 5 楼 SSY6p 的回复:
我想把这个二维数组当成一个一维数组访问,为什么不行嘞

怎么不行?完全可以,可以参考我上面的回复。
数组在内存中只是一块地址连续的空间,怎么解析完全由你自己决定。
L77'bagabaga 2021-01-02
  • 打赏
  • 举报
回复
我想把这个二维数组当成一个一维数组访问,为什么不行嘞
forever74 2021-01-02
  • 打赏
  • 举报
回复
sum才是int(*)[4]类型, &sum是int(*)[3][4]类型了,一旦+1会加出去48字节那种。
ctrigger 2021-01-02
  • 打赏
  • 举报
回复
仅供参考:
#include <stdio.h>

int sun(int *a, int size)
{
int i, sum = 0;
for(i=0; i<size; i++) sum += a[i];
return sum;
}

int main(void)
{
int sum[3][4] = {1,1,1,1,1,1,1,1,1,1,1,1};
printf("%d\n", sun((int *)sum, 12));
return 0;
}
forever74 2021-01-02
  • 打赏
  • 举报
回复
因为指针和数组终究是不一样的。 你的*a会被理解为取目标,而实际上它继承的数组地址,因而没有“目标”。 两个双星的地方用单星,然后sum+=a[i];即可。
qybao 2021-01-02
  • 打赏
  • 举报
回复
&sum是int (*)[4]类型,也就是数组指针(指向长度为4的数组的指针)。和int**不是同一个类型。

69,369

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧