- 7
- 0
- 约4.32千字
- 约 12页
- 2018-01-01 发布于河南
- 举报
指针数组分配动态内存
指针数组分配动态内存
二维数组定义以及动态分配空间
标签: 指针数组动态分配内存分配函数参数
分类: 程序语言
一、下面三种定义形式怎么理解?怎么动态分配空间?
(1)、int**Ptr;
(2)、int*Ptr[5];我更喜欢写成int*Prt[5];
(3)、int(*Ptr)[5];
二、意义:
(1)、int**Ptr表示指向一群指向整数的指针的指针。
(2)、int*Ptr[5]指针数组,该数组有5个元素,每个元素都是一个指向整型的指针(即一个地址)
(3)、int(*Ptr)[5]数组指针。
三、所占空间:
(1)、int**Ptr和(3)、int(*Ptr)[5]一样,在32位平台里,都是4字节,即一个指针。但(2)、int*Ptr[5]不同,它是5个指针,它占5*4=20个字节的内存空间。
四、用法:
(1)、int**Ptr因为是指针的指针,需要两次内存分配才能使用其最终内容。首先,Ptr=(int**)newint*[5];这样分配好了以后,它和(2)的意义相同了;然后要分别对5个指针进行内存分配,例如:Ptr[0]=newint[20];它表示为第0个指针分配20个整数,分配好以后,Ptr[0]为指向20个整数的数组。这时可以使用下标用法Ptr[0][0]到
Ptr[0][19]了。如果没有第一次内存分配,该Ptr是个野指针,是不能使用的,如果没有第二次内存分配,则Ptr[0]等也是个野指针,也是不能用的。当然,用它指向某个已经定义的地址则是允许的,那是另外的用法(类似于借鸡生蛋的做法),这里不作讨论(下同)。
例子:
C语言:
//动态分配二维数组空间
{
m_iHight=10;//二维数组的高度
m_i;//二维数组的宽度
//动态分配一个二维数组m_ppTable内存空间
//其类型为int
//m_ppTable指向该数组
int**m_ppTable;
m_ppTable=newint*[m_iHight];
//动态分配m_iHight个类型为int*的内存空间
//分配的是行地址空间
for(inti=0;i
m_ppTable[i]=newint[m_iWidth];
//动态分配m_iWidth个类型为int的内存空间
//分配的是某行的数值空间
}
//由此分配的二维数组空间并非是连续的
//可以使用m_ppTable[row][col]来给该二维数组赋值
//其中0=row
//释放所分配的内存空间
{
for(inti=0;i
delete[m_iWidth]m_ppTable[i];//以行为单位释放数值空间
delete[m_iHight]m_ppTable;//释放行地址空间
}
int**a;
a=(int**)calloc(sizeof(int*),n);
for(i=0;ia[i]=(int*)calloc(sizeof(int),n);//这样就可以了,使用的时候就和普通的二维数组一样,最后用
for(i=0;icfree(a[i]);
cfree(a);//释放内存就可以了
(2)、int*Ptr[5]这样定义的话,编译器已经为它分配了5个指针的空间,这相当于(1)中的第一次内存分配。根据对(1)的讨论可知,显然要对其进行一次内存分配的。否则就是野指针。
(3)、int(*Ptr)[5]这种定义我觉得很费解,不是不懂,而是觉得理解起来特别吃力,也许是我不太习惯这样的定义吧。怎么描述它呢?它的意义是一群指针,每个指针都是指向一个5个整数的数组。如果想分配k个指针,
这样写:Ptr=(int(*)[5])newint[5*k]。这是一次性的内存分配。分配好以后,Ptr指向一片连续的地址空间,
其中Ptr[0]指向第0个5个整数数组的首地址,Ptr[1]指向第1个5个整数数组的首地址。
综上所述,我觉得可以这样理解它们:
int**Ptrlt;==intPtr[x][y];
int*Ptr[5]==intPtr[5][x];
int(*Ptr)[5]==intPtr[x][5];
这里x和y是表示若干的意思。
_______________________________________________________________
1.C语言动态分配二维数组
(1)已知第二维
Code-1
char(*a)[N];//指向数组的指针
a=(char(*)[N])malloc(sizeof(char*)*m);
printf(%d\n,sizeof(a));//4,指针
printf(%d\n,sizeof(a[0]));//N,一维数组
free(a);
(2)已知第一维
Code-2
char*a[M];//指针的数组
inti;
for(i=0;iM;i+
原创力文档

文档评论(0)