前言:
当前同学们对“c语言数组调用方法”大约比较关心,各位老铁们都想要知道一些“c语言数组调用方法”的相关资讯。那么小编同时在网上汇集了一些有关“c语言数组调用方法””的相关知识,希望朋友们能喜欢,同学们快快来学习一下吧!二维数组逻辑上是二维,物理存储实质是一维。逻辑上的二维数组,是指一个数组的数组,如int arr[R][C]; int i, j;
数组arr的元素是数组arr[i],arr[i][j]。
arr在与运算符&和sizeof的上下文中表示整个数组,其类型是int[R][C]。
arr在其它的上下文中表示数组的元素,其类型是int[C],是一个一维数组指针int(*)[C]。
如此规定有其合理性存在,因为操作数组的绝大部分时间是操作数组的元素,如arr[i][j],是*(*(arr+i)+j)的语法糖。arr+i是按元素的长度sizeof(int[C])*i的字节数进行移动而形成对元素的访问。所以,二维数组自然可以通过一个一维数组指针来访问。
二维数组逻辑上是一个数组的数组,可以用一个一维指针数组的元素来引用一个二维数组的元素(一维数组)。也就是可以用一个一维指针数组来操作一个二维数组。
二维数组的物理存储还是线性的顺序存储,自然,也可以使用一个一级指针来操作二维数组。
对于返回动态二维数组,通常可以先建立一个一维的动态指针数组,再由数组元素(指针)指向一个一维动态数组。逻辑便构建了一个动态二维数组。
#include <stdio.h>#include <malloc.h>#define ROW 3#define COL 5void arr2D(){ int arr[ROW][COL] = {0}; int i,j; for(i=0;i<ROW;i++) for(j=0;j<COL;j++) arr[i][j] = (i+1)*(j+1); int (*ap)[COL] = arr; // 使用一维数组指针(行指针)引用二维数组元素 for(i=0;i<ROW;i++) { for(j=0;j<COL;j++) printf("%2d ",*(*(ap+i)+j)); // ap+i移动的字节数是sizeof int[COL]*i printf("\n"); } printf("\n"); int *pa[COL] = {0}; // 使用一维指针数组引用二维数组元素 for(i=0;i<ROW;i++) pa[i] = arr[i]; for(i=0;i<ROW;i++) { for(j=0;j<COL;j++) printf("%2d ",*(*(pa+i)+j)); // pa+i移动的字节数是sizeof (int*) *j,由指针指向数组 printf("\n"); } printf("\n"); int *p =(int*)arr; // 使用一级指针引用二维数组元素 for(i=0;i<ROW;i++) for(j=0;j<COL;j++) *(p+i*COL+j) = (i+1)*(j+1); for(i=0;i<ROW;i++) { for(j=0;j<COL;j++) printf("%2d ",*(p+i*COL+j)); printf("\n"); } printf("\n");}int **darr2d(int row,int col,int(**ap)[COL],int(**pd)[ROW][COL]){ int i; // 1 通过一维数组指针建立动态二维数组(行、列皆为变量) int **dp = (int**)malloc(sizeof(int*)*row); for(i=0;i<row;i++) dp[i] = (int*)malloc(sizeof(int)*col); // 由指针指向数组 // 2 通过一维数组指针(行指针)建立动态二维数组(列数为常量) *ap = (int(*)[COL])malloc(sizeof(int[COL])*row); // 3 通过二维数组指针建立动态二维数组(行、列皆为常量) *pd = (int(*)[ROW][COL])malloc(sizeof(int[ROW][COL])); return dp;}void darr2dTest(){ int(*ap)[COL]; int (*pd)[ROW][COL]; int row = 4; int col = 6; int i,j; int **dp = darr2d(row,col,&ap,&pd); for(i=0;i<row;i++) // 测试一维数组指针动态分配的内存 for(j=0;j<COL;j++) ap[i][j] = (i+1)*(j+1); for(i=0;i<row;i++) { for(j=0;j<COL;j++) printf("%2d ",*(*(ap+i)+j)); printf("\n"); } printf("\n"); free(ap); for(i=0;i<ROW;i++) // 测试二维数组指针动态分配的内存 for(j=0;j<COL;j++) (*pd)[i][j] = (i+1)*(j+1); for(i=0;i<ROW;i++) { for(j=0;j<COL;j++) printf("%2d ",*(*(*pd+i)+j)); printf("\n"); } printf("\n"); free(pd); for(i=0;i<row;i++) // 测试二维数组动态分配的内存 for(j=0;j<col;j++) dp[i][j] = (i+1)*(j+1); for(i=0;i<row;i++) { for(j=0;j<col;j++) printf("%2d ",*(*(dp+i)+j)); printf("\n"); } printf("\n"); for(i=0;i<row;i++) free(dp[i]); free(dp);}int main(){ arr2D(); darr2dTest(); getchar(); return 0;}/* 1 2 3 4 5 2 4 6 8 10 3 6 9 12 15 1 2 3 4 5 2 4 6 8 10 3 6 9 12 15 1 2 3 4 5 2 4 6 8 10 3 6 9 12 15 1 2 3 4 5 2 4 6 8 10 3 6 9 12 15 4 8 12 16 20 1 2 3 4 5 2 4 6 8 10 3 6 9 12 15 1 2 3 4 5 6 2 4 6 8 10 12 3 6 9 12 15 18 4 8 12 16 20 24*/
图示:
-End-
标签: #c语言数组调用方法