指针数组与数组指针

本文解析了数组指针和指针数组的概念,强调两者在动态内存分配中的应用。通过示例代码,展示了如何使用数组指针为未知维度的数组分配内存,以及如何用指针数组指向二维数组的每一行。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

核心要点:数组指针是指向数组的指针,指针数组是存放指针的数组。指针数组是数组,数组指针是指针。在这里插入图片描述

数组指针: (*a)[ ] : ()的优先级比[ ]要高,所以(*a)[ ] 首先是一个指针,然后再指向一个数组,数组指针又称为行指针
指针数组: *a[ ] : [ ]的优先级比*要高,所以*a[ ] 首先是一个数组,然后其存放的数据类型才是指针
指针数组和数组指针用于动态内存分配

#include <stdio.h>
#define N 5
#define M 4
using namespace std;
int main(int argc,char* argv[])
{
    int m=4;
    
    //已知第二维,第一维未知
    int (*a)[N]=new int[m][N]; //数组指针
    
    //已知第一维,第二维未知
    int i,n=5;
    int *b[M];                 //指针数组
    for(i=0;i<M;i++)
    {
        b[i]=new int[n];       //为每一行分配内存
    }
    return 0;
}

理解二维数组的内存的动态分配,就需要理解二维数组的存储方式,

#include <stdio.h>
#define M 3
#define N 4
using namespace std;
int main(int argc,char* argv[])
{
    int arr[M][N];
    int i,j;
    for(i=0;i<M;i++)
    {
        for(j=0;j<N;j++)
        {
            printf("&arr[%d][%d]=%p\n",i,j,&arr[i][j]);
        }
    }
    return 0;
}

输出如下:

&arr[0][0]=0061FEE8
&arr[0][1]=0061FEEC
&arr[0][2]=0061FEF0
&arr[0][3]=0061FEF4
&arr[1][0]=0061FEF8
&arr[1][1]=0061FEFC
&arr[1][2]=0061FF00
&arr[1][3]=0061FF04
&arr[2][0]=0061FF08
&arr[2][1]=0061FF0C
&arr[2][2]=0061FF10
&arr[2][3]=0061FF14

可知二维数组也是连续分配内存的,而数组指针所指向的空间也是连续的,接下来只需要将该指针指向此二维数组的首地址就可以了。那么在利用数组指针为第一维未知,第二维已知的数组动态分配内存时,便可以进行一次性分配内存了。而指针数组是多个指针,每一个指针需要指向二维数组的每一行的首地址,所以需要多次动态分配。
事实上,已知二维数组的第一维,未知第二维也是可以进行一次性动态内存分配的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值