C |深入理解数组的维度及其指针的级数和移动
C |深入理解数组的维度及其指针的级数和移动
小智雅汇2021-02-15 14:35:14
数组作为函数参数时会转变为指针。怎样转变呢?将数组名转变为指向数组首元素的指针变量。如有三维数组:
int arr[3][4][5];
arr的类型信息是int[3][4][5],&arr 1表达式中的“ 1”移动的是3*4*5*sizeof(int)个字节。
arr[0]的类型信息是int[4][5],arr 1表达式中的“ 1”移动的是4*5*sizeof(int)个字节。
arr[0][0]的类型信息是int[5],arr[0] 1表达式中的“ 1”移动的是5*sizeof(int)个字节。
arr[0][0][0]的类型信息是int,arr[0][0] 1表达式中的“ 1”移动的是sizeof(int)个字节。
经过三级解引用可以取其具体值:
int v = arr[2][2][2];
数组名转变为指针变量,要求数组的维数与指针的级数有一致关系,要求一定程度上保留长度信息,要求指针的算术运算(如上述的“ 1”操作)能满足指针移动的实际需要。
答案就是将第一维转变为指针,剩下的维度(如果是n维的话,剩下n-1维)表示数组类型,也就是转变为指向数组元素的指针。如果一个n维数组,其数组元素为n-1维数组,这个指针变量指向一个n-1维数组,也就是一个n-1维数组指针。
int arr[3][4][5]; // 具有第一、二、三维的长度信息int (*p)[4][5] = arr; // 数组指针引用数组,需补充第一维的长度信息int *p1 = arr[0][0]; // 一级指针引用数组,需补充第一、二、三维的长度信息此时的指针变量p的级数与数组arr的维数具有一致性,p的算术运算能够符合指针移动的需要。p虽然有了指针的灵活性(arr是一个常量),但却丧失掉了第一维的长度信息。数组在声明数组指针时,其它维度都必须是常量,在用做函数参数时,不如用一个一级指针来引用数组来得方便:
#include <iostream>using namespace std;void output2dArray(int(*arr)[4],int row){ for(int i=0;i<row;i ) { for(int j=0;j<4;j ) //cout<<arr[i][j]<<' '; //cout<<(*(arr i))[j]<<' '; //cout<<*(arr[i] j)<<' '; cout<<*(*(arr i) j)<<' '; //cout<<*(*arr i*4 j)<<' '; cout<<endl; } cout<<endl;}void output2dArrayP(int* arr,int row,int col){ for(int i=0;i<row;i ) { for(int j=0;j<col;j ) cout<<*(arr i*col j)<<' '; cout<<endl; } cout<<endl;}void output3dArray(int(*arr)[3][4],int layer){ for(int i=0;i<layer;i ) { for(int j=0;j<3;j ) { for(int k=0;k<4;k ) cout<<arr[i][j][k]<<' '; //cout<<*(arr[i][j] k)<<' '; //cout<<*(*(arr[i] j) k)<<' '; //cout<<*(*(*(arr i) j) k)<<' '; //cout<<(*(*(arr i) j))[k]<<' '; //cout<<(*(arr i))[j][k]<<' '; //cout<<*(**arr i*3*4 j*4 k)<<' '; cout<<endl; } cout<<endl; } cout<<endl;}void output3dArrayP(int* arr,int layer,int row,int col){ for(int i=0;i<layer;i ) { for(int j=0;j<row;j ) { for(int k=0;k<col;k ) cout<<*(arr (i*row j)*col k)<<' '; cout<<endl; } cout<<endl; } cout<<endl;}int main(){ int arr2[3][4]= {1,2,3,4,5,6,7,8,9,10,11,12}; output2dArray(arr2,3); output2dArrayP(arr2[0],3,4); int arr3[2][3][4]= {1,2,3,4,5,6,7,8,9,10,11,12, 13,14,15,16,17,18,19,20,21,22,23,24}; output3dArray(arr3,2); output3dArrayP(arr3[0][0],2,3,4); while(1); return 0;}/*1 2 3 45 6 7 89 10 11 121 2 3 45 6 7 89 10 11 121 2 3 45 6 7 89 10 11 1213 14 15 1617 18 19 2021 22 23 241 2 3 45 6 7 89 10 11 1213 14 15 1617 18 19 2021 22 23 24*/
-End-
收藏
举报
0 条评论
赞 (0)
