JAVA和Nginx 教程大全

网站首页 > 精选教程 正文

C++|深入理解数组的维度及其指针的级数和移动

wys521 2024-11-16 01:46:04 精选教程 21 ℃ 0 评论

数组作为函数参数时会转变为指针。怎样转变呢?将数组名转变为指向数组首元素的指针变量。如有三维数组:

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 4
5 6 7 8
9 10 11 12

1 2 3 4
5 6 7 8
9 10 11 12

1 2 3 4
5 6 7 8
9 10 11 12

13 14 15 16
17 18 19 20
21 22 23 24


1 2 3 4
5 6 7 8
9 10 11 12

13 14 15 16
17 18 19 20
21 22 23 24
*/

-End-

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表