龙空技术网

C|折腾二维数组

小智雅汇 352

前言:

现时朋友们对“数组对角线求和c语言”大体比较珍视,小伙伴们都需要学习一些“数组对角线求和c语言”的相关资讯。那么小编同时在网摘上搜集了一些关于“数组对角线求和c语言””的相关内容,希望看官们能喜欢,大家快快来学习一下吧!

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

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

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 1212 11 10  9 8  7  6  5 4  3  2  136*/
2 二维指针处理二维数组

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

#include <stdio.h>#include <stdlib.h>#define COL 4int** 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 4int(*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 4int(*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-

标签: #数组对角线求和c语言