分享

C |指针数组、二级指针、动态二维数组及三者的相关关系

 zhuxrgf 2021-02-16

C |指针数组、二级指针、动态二维数组及三者的相关关系

小智雅汇2021-02-16 08:21:53

超过一维的n维数组可以转换为n-1维数组指针,只是丧失了第一维的长度信息。声明与n维数组等价的n-1维数组指针时,只需将第一维改写为指针形式(*)即可。

一维数组名可以转换为一级指针,也是丧失了长度信息。

char str[12]; char *sp = str; // 注意符号“*”与“[]”一定意义上的等价性 int arr2[3][4]; int (*p2)[4] = arr2; int arr3[3][4][5]; int (*p3)[4][5] = arr3;

对于一维数组,如果其元素是一个指针呢?如:

char* str[12];

等价的指针形式应该怎样写?

如前面所述,str对应一级指针,自然,改写后与二级指针等价了,当然,长度信息也没有了。

char **strs = str;

看如下实例:

#include <iostream>
using namespace std;

void print(char *str, int len)
{
    for(int i=0;i<len;i  )
        cout<<str[i];
    cout<<endl;
}

void print2(char **str, int len)
{
    for(int i=0;i<len;i  )
        cout<<str[i]<<' ';
    cout<<endl;
} 

int main()
{
    char alp[12] = 'abcdefghijk';
    print(alp,12);

    char* month[12]={'January','February','March',
                      'April','May','June',
                      'July','August','September',
                      'October', 'November','December'};
    print2(month,12);
    while(1);
    return 0;
}

我们知道,申请堆内存时,返回一个指针,可以是申请单个或多个内建数据类型(Built-in data type)(或结构体)。当申请的是多个内建数据类型(Built-in data type)(或结构体)时,也就是相当于建立了一个动态一维数组。如果想申请一个n行m列的动态二维数组呢?虽然可以将n行m列的动态二维数组看成一维的n*m个元素的动态一维数组,只是处理的逻辑要做一些改变,但有没有办法可以直接申请一个逻辑上的动态二维数组呢?答案是先建立一个动态的一维指针数组,再循环将每一个指针指向一个动态一维数组。如前面所述,一维指针数组逻辑上等价于一个二维指针。

char **pp = new char*[12]; for(int i=0;i<12;i ) pp[i] = new char[10]; // …… for(int j=0;j<12;j ) delete pp[j]; delete pp;

-End-

收藏
举报
0 条评论

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多