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

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)

相关推荐

  • C语言-八道笔试题由浅入深玩转指针

    前言:本文章将带你刷8道比较有意思的指针笔试题,笔者将由深入浅出解析这些题目!必要的题目,作者已经加上内存布局图!希望本文对你有所帮助! 目录 一.笔试题1 -指针与一维数组的关系-值 二.笔试题2- ...

  • C语言中数组的总结

    #目录 # 一维数组的创建和初始化 一维数组的使用 一维数组在内存中的存储 指针的初步介绍 一维数组的指针访问 二维数组的创建和初始化 二维数组的使用 二维数组在内存中的存储 二维数组的指针访问 有关 ...

  • 数组运算4(二维数组与二维数组的运算)

    接着来说数组的运算,今天是二维数组与二维数组的运算. -01- 运算规则 1.尺寸相同的二维数组的运算. 如下图所示,将2个二维区域进行相加运算,结果输出到黄色区域.可以看到它们的运算规则也是一一对应 ...

  • 数组运算3(二维数组与单值的运算)

    -01- 运算规则 如下图所示,将A1:C3这个二维区域与单值10进行相加,结果输出到G1:I3.可以看到这个二维区域的每个值分别与10相加,得到的是个与原区域尺寸一样的二维数组,也就是它们的行数和列 ...

  • c++指针数组与二维数组的最大区别

    下面随笔是关于指针数组说明及与二维数组的最大区别. 指针数组 数组的元素是指针型 例 利用指针数组存放矩阵 1 #include 2 using namespace std; 3 int main() ...

  • 动态内存分配连续内存空间的二维数组

    可以直接使用一维数组来模拟二维数组,下面的代码就是在此基础上,用一个二级指针指向一维数组的相应地方,详见代码 #include <stdio.h> #include <malloc. ...

  • VB中怎样对一个二维数组的行进行操作

    通常,数学上的行列式或者矩阵,用二维数组来存放数据,二维数组的第1维,就是映射矩阵的行,二维数组的第2维,就是映射矩阵的列. 例如: dim d(1 To 3,1 To 4) As Integer 对 ...

  • 如何将二维数组作为函数的参数传递

    今天写程序的时候要用到二维数组作参数传给一个函数,我发现将二维数组作参数进行传递还不是想象得那么简单里,但是最后我也解决了遇到的问题,所以这篇文章主要介绍如何处理二维数组当作参数传递的情况,希望大家不 ...

  • 假设客车的座位数是9行4列,使用二维数组在控制台应用程序中实现简单的客车售票系统。

    具体要求为: 使用一个二维数组记录客车售票系统中的所有座位号,并在每个座位号上都显示有票,然后用户输入一个坐标位置,按Enter键,即可将该座位号显示为已售. 首先我定义的输入格式为:1,2 个人认为 ...

  • 二维数组

    如果数组元素又是数组,则称为多维数组,常用的是二维数组. 二维数组可以看成由两个一维数组组成,所以很多东西与一维数组类似,如其声明的方法.可进行的运算等等. 1.声明二维数组 数组类型数组名[][]: ...

  • java学习——25.二维数组

    如果数组元素又是数组,则称为多维数组,常用的是二维数组. 二维数组可以看成由两个一维数组组成,所以很多东西与一维数组类似,如其声明的方法.可进行的运算等等. 1.声明二维数组 数组类型数组名[][]: ...