为什么是99二维数组向一维数组转变

img


二维数组向一维数组转变需要注意什么,取地址后不应该把所有的数字都输入进去了吗

二维数组在 内存中 是 按行存储的,
如你这个二维数组:
16 27 8 -6
-17 21 5 19
66 9 58 86
在内存中实际是这样存储的
16 27 8 -6 -17 21 5 19 66 9 58 86

主函数中传的 arr[0] 实际上是 行指针,对应 arr[0][0] = 16 的首地址。
然后 sum_array实际上是求 这些 数的总和,即 292

这个要从数组在内存中的地址来进行分析了,实际上程序的意思是二维数组所有元素的和,结果就出来!数组内存分析可以私聊!

没有什么转变这回事
二维数组就是二维数组,一维数组就是一维数组
只不过c语言不会判断访问越界
而数组是顺序表,地址是连续的
当你定义一个3x4的数组,用二维方式访问下标是这样的
0,0 0,1 0,2 0,3
1,0 1,1 1,2 1,3
2,0 2,1 2,2 2,3
那么按一维方式访问就是这样的
0 1 2 3
4 5 6 7
8 9 10 11
-=-=-=-=
注意你传入的实参不是arr而是arr[0]
而你打印的也不是s而是a[i],后面99访问早已越界,是个随机数

不知道你这个问题是否已经解决, 如果还没有解决的话:
  • 这有个类似的问题, 你可以参考下: https://ask.csdn.net/questions/833274
  • 这篇博客也不错, 你可以看下指针 指向一维数组 二维数组 字符数组 返回值为地址 指向函数的指针 指针数组 常量指针
  • 除此之外, 这篇博客: 指针详解中的 针对二维数组传参中那个数组指针案例,我写了一个代码加以理解,二维数组的数组名和一维数组的数组名区别 部分也许能够解决你的问题, 你可以仔细阅读以下内容或者直接跳转源博客中阅读:
    #include <stdio.h>
    void test(int(*p)[3])    /*一维数组名接收*/
    {
        for (int j = 0; j < 3; j++)
        {
            printf("%d ", (*p)[j]);
        }
        printf("\n");
    }
    
    void test1(int(*p)[5])/*二维数组名接收*/
    {
        for (int i = 0; i < 3; i++)
        {
            for (int j = 0; j < 5; j++)
            {
                printf("%d ", (*(p + i))[j]);
            }
            printf("\n");
        }
    }
    int main()
    {
        int arr1[3] = { 1, 2, 3 };
        //一个数组
        
        
        int arr[3][5] = { {1,2,3,4,5} ,{2,3,4,5,6}, {3,4,5,6,7} };
        test(&arr1);//传的数组地址;
        test1(arr);//传的是一维的数组地址(二维数组本质上是多个一维数组连接在一起储存)
        return 0;
    }
    
    /*运行结果:
    1 2 3
    1 2 3 4 5 
    2 3 4 5 6
    3 4 5 6 7
    */
    

    解释:

    一维数组: &arr这个代表数组地址,不是首元素地址,而数组地址一般用数组指针接收,因为数组指针指向数组

    p是指针,p等于&arr, 所以*p就等于arr, arr[] 就等于 (*p)[]

    二维数组:arr可以理解为就等于&arr,只是没有&. 就相当于 p = &arr,只是写的时候没有&

    所以 *p就是二维数组中真正的首元素地址,即第一个元素地址.在上面程序中i是行,所以*(p+i) 就是下一行中的第一个元素地址.

    所以*(p+i) + j就是第i行j列的某一个元素地址,所以*(*(p+i) + j)就是i行j列某一个具体元素 也可以写成(*(p+i))[j]

  • 您还可以看一下 吴刚老师的【吴刚】淘宝天猫网站设计初级入门标准视频教程课程中的 01-电商网站设计的风格定位和网站设计的根本需求点分小节, 巩固相关知识点
  • 以下回答来自chatgpt:

    解答:

    将二维数组转换为一维数组可以使用for循环或者指针的方式进行操作。具体操作流程如下:

    1.先确定一维数组的长度,即将二维数组全部元素放到一维数组中的总个数。

    2.定义一维数组并进行动态分配内存。

    3.使用for循环或者指针的方式遍历二维数组中的每个元素,并依次存储到一维数组中。

    4.对于数组中的每个元素,在一维数组中的存储方式要与二维数组的存储方式一致。

    需要注意的问题如下:

    1.在进行地址传递时,不应该将二维数组中所有的数字都输入到一维数组中,因为在二维数组中每一行的元素个数可能是不同的,如果全部输入可能会导致数组越界。

    2.在将二维数组转换为一维数组时,需要对数组进行动态分配内存,否则容易造成内存泄漏或溢出等问题。

    以下是一段使用指针的方式将二维数组转换为一维数组的示例代码:

    int main()
    {
        int arr[3][4] = {
            {1, 2, 3, 4},
            {5, 6, 7, 8},
            {9, 10, 11, 12}
        };
        int *oneArr;
        oneArr = (int*)malloc(sizeof(int) * 3 * 4); //分配内存
        int i, j;
        for(i = 0; i < 3; i++) {
            for(j = 0; j < 4; j++) {
                *(oneArr + i*4 + j) = arr[i][j];
            }
        }
        for(i = 0; i < 12; i++) {
            printf("%d", *(oneArr + i)); //遍历输出一维数组
        }
        free(oneArr); //释放内存
        return 0;
    }
    

    以上代码通过指针的方式遍历二维数组中的每个元素,并将其存储到一维数组中,最后遍历输出一维数组的元素。

    另外,需要注意在给一维数组分配内存时,要注意动态分配内存的方式。在C语言中可以使用malloc或calloc函数动态分配内存,使用完记得释放内存。


如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^

结果就是把这些数字加在一起,应该是292

img