优秀的编程知识分享平台

网站首页 > 技术文章 正文

C|折腾二维数组(c++二维数组的赋值)

nanyue 2024-10-19 06:55:43 技术文章 6 ℃

二维数组应该是一种最常用的数据结构了,二维相对一维,确实复杂了不只一个维度。

二维数组是数组的数组,其元素是一个数组,如果用指针指向,需要有长度信息,才可以用正常的指针算术运算(元素指针偏移)。

1 行序优先、列序优先,倒序处理,对角线数据处理

#include <stdio.h>
#include <stdlib.h>

int main()
{
    int i,j;
    int row = 3;
    const int COL = 4;
    int arr[][COL] = {1,2,3,4,5,6,7,8,9,10,11,12};
    for(i=0;i<row;i++)  // 行序优先
    {
        for(j=0;j<COL;j++)
            printf("%2d ",arr[i][j]);
        printf("\n");
    }
    for(i=0;i<COL;i++)  // 列序优先
    {
        for(j=0;j<row;j++)
            printf("%2d ",arr[j][i]);
        printf("\n");
    }
    for(i=row-1;i>=0;i--)  // 倒序输出
    {
        for(j=COL-1;j>=0;j--)
            printf("%2d ",arr[i][j]);
        printf("\n");
    }
    int sum = 0;
    for(i=0;i<row;i++) // 对角线数据求和
    {
        sum += arr[i][i] + arr[i][row-i-1];
    }
    printf("%d\n",sum);
    getchar();
    return 0;
}
/*output:
 1  2  3  4
 5  6  7  8
 9 10 11 12
 1  5  9
 2  6 10
 3  7 11
 4  8 12
12 11 10  9
 8  7  6  5
 4  3  2  1
36
*/

2 二维指针处理二维数组

首先需要注意的是,二维指针的解引用是一个指针,二维数组名的元素是一个有长度信息的数组,二者不具有等同性,可以有关联性。

#include <stdio.h>
#include <stdlib.h>
#define COL 4
int** func2P(int row)
{
    int i,j;
    int**pp = (int**)malloc(sizeof(int*)*row);
    for(i=0;i<row;i++)
        pp[i] = (int*)malloc(sizeof(int)*COL);
    for(i=0;i<row;i++)
        for(j=0;j<COL;j++)
            pp[i][j] = (i+1)*(j+1);
    return pp;
}

int main()
{
    int row = 3;
    int**arr = func2P(row);
    for(int i=0;i<row;i++)
    {
        for(int j=0;j<COL;j++)
            printf("%2d ",arr[i][j]);
        printf("\n");
    }
    free(arr);
    getchar();
    return 0;
}
/*output:
 1  2  3  4
 2  4  6  8
 3  6  9 12
*/

3 数组指针处理二维数组

#include <stdio.h>
#include <stdlib.h>

#define COL 4
int(*funcArr2D(int row))[COL]  // 返回一个数组指针
{
    int (*buf)[COL];
    buf = (int(*)[COL])malloc(row*COL*sizeof(int)); // malloc(row); ?
    for(int i=0;i<row;i++)
        for(int j=0;j<COL;j++)
            buf[i][j] = (i+1)*(j+1);
    return buf;
}

int main()
{
    int row = 3;
    int(*arr)[4] = funcArr2D(row);
    for(int i=0;i<row;i++)
    {
        for(int j=0;j<COL;j++)
            //printf("%2d ",arr[i][j]);
            printf("%2d ",*(*(arr+i)+j));
        printf("\n");
    }
    free(arr);
    getchar();
    return 0;
}
/*output:
 1  2  3  4
 2  4  6  8
 3  6  9 12
*/

如果是C++,也可以使用数组指针获得一个二维数组:

void test()
{
    int (*a)[6] = new int[5][6];
    for(int i=0;i<5;i++)
        for(int j=0;j<6;j++)
            a[i][j] = (i+1)*(j+1);
}

4一维数组和二维数组相互赋值

内存本质上是一个顺序存储的线性字节数组。二维数组只是逻辑上的概念,本质上是数组的数组。

#include <stdio.h>
#include <stdlib.h>

#define COL 4
int(*funcArr2D(int row))[COL]
{
    int (*buf)[COL];
    buf = (int(*)[COL])malloc(row*COL*sizeof(int)); // malloc(row); ?
    for(int i=0;i<row;i++)
        for(int j=0;j<COL;j++)
            buf[i][j] = (i+1)*(j+1);
    return buf;
}

int* func1P(int row)
{
    int* p = (int*)malloc(sizeof(int)*row*COL);
    for(int i=0;i<row*COL;i++)
        p[i] = i+1;
    return p;
}

int main()
{
    int row = 3;
    int(*arr2)[4] = funcArr2D(row);
    int* arr1 = func1P(row);
    for(int i=0;i<row*COL;i++)
        arr2[i/COL][i%COL] = arr1[i];
    for(i=0;i<row;i++)
    {
        for(int j=0;j<COL;j++)
            printf("%2d ",arr2[i][j]);
        printf("\n");
    }
    free(arr2);
    free(arr1);
    getchar();
    return 0;
}
/*output:
 1  2  3  4
 2  4  6  8
 3  6  9 12
*/

5 使用指针数组处理二维数组

#include <stdio.h>
int main()
{
    int b[2][3]= {{1,2,3},{2,4,6}};
    int *pb[2];
    int i,j;
    pb[0]=b[0];
    pb[1]=b[1];
    for(i=0; i<2; i++)
    {
        for(j=0; j<3; j++,pb[i]++)
            printf("%2d",*pb[i]);
        printf("\n");
    }
    return 0;
}

-End-

最近发表
标签列表