欢迎来到天天文库
浏览记录
ID:21376996
大小:31.00 KB
页数:3页
时间:2018-10-21
《二维数组定义以和动态分配空间》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库。
1、二维数组定义以及动态分配空间(转)下面三种定义形式怎么理解?怎么动态分配空间?(1)、int**Ptr;(2)、int*Ptr[5];我更喜欢写成int*Prt[5];(3)、int(*Ptr)[5];此文引自网上,出处不详,但是觉得非常好。略改了一点。多维数组一向很难,一般都采用一维数组,但是一旦要用到还真是头疼。闲话少说,这里我就以三个二维数组的比较来展开讨论: (1)、int**Ptr; (2)、int*Ptr[5];我更喜欢写成int*Prt[5]; (3)、int(*Ptr)[5]; 以上三例
2、都是整数的二维数组,都可以用形如Ptr[1][1]的方式访问其内容;但它们的差别却是很大的。下面我从四个方面对它们进行讨论: 一、内容: 它们本身都是指针,它们的最终内容都是整数。注意我这里说的是最终内容,而不是中间内容,比如你写Ptr[0],对于三者来说,其内容都是一个整数指针,即int*;Ptr[1][1 ]这样的形式才是其最终内容。 二、意义: (1)、int**Ptr表示指向"一群"指向整数的指针的指针。 (2)、int*Ptr[5]表示指向5个指向整数的指针的指针,
3、或者说Ptr有5个指向"一群"整数的指针,Ptr是这5个指针构成的数组的地址 (3)、int(*Ptr)[5]表示指向"一群"指向5个整数数组的指针的指针。 三、所占空间: (1)、int**Ptr和(3)、int(*Ptr)[5]一样,在32位平台里,都是4字节,即一个指针。 但(2)、int*Ptr[5]不同,它是5个指针,它占5*4=20个字节的内存空间。 四、用法: (1)、int**Ptr 因为是指针的指针,需要两次内存分配才能使用其最终内容。
4、首先,Ptr=(int**)newint*[5];这样分配好了以后,它和(2)的意义相同了;然后要分别对5个指针进行内存分配,例如: Ptr[0]=newint[20]; 它表示为第0个指针分配20个整数,分配好以后,Ptr[0]为指向20个整数的数组。这时可以使用下标用法Ptr[0][0]到Ptr[0][19]了。 如果没有第一次内存分配,该Ptr是个"野"指针,是不能使用的,如果没有第二次内存分配,则Ptr[0]等也是个"野"指针,也是不能用的。当然,用它指向某个已经定义的地址则是允许的,那是另外的用法(类
5、似于"借鸡生蛋"的做法),这里不作讨论(下同)。例子: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_i
6、Width]; //动态分配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
7、*),n);for(i=0;i a[i]=(int*)calloc(sizeof(int),n);这样就可以了使用的时候就和普通的二维数组一样最后用for(i=0;i cfree(a[i]);cfree(a);释放内存就可以了 (2)、int*Ptr[5] 这样定义的话,编译器已经为它分配了5个指针的空间,这相当于(1)中的第一次内存分配。根据对(1)的讨论可知,显然要对其进行一次内存分配的。否则就是"野"指针。 (3)、int(*Ptr)[5] 这种定义我觉得很费解,不是不懂,而
8、是觉得理解起来特别吃力,也许是我不太习惯这样的定义吧。怎么描述它呢?它的意义是"一群"指针,每个指针都是指向一个5个整数的数组。如果想分配k个指针,这样写:Ptr=(int(*)[5])newint[5*k]。这是一次性的内存分配。分配好以后,Ptr指向一片连续的地址空间,其中Ptr[0]
此文档下载收益归作者所有