关键词不能为空

当前您在: 主页 > 英语 >

二维数组定义以及动态分配空间

作者:高考题库网
来源:https://www.bjmy2z.cn/gaokao
2021-02-08 03:13
tags:

-

2021年2月8日发(作者:距离)


二维数组定义以及动态分配空间



(



)



下面三种定义形式怎么理解?怎么动态分配空间?




(1)



int


**Ptr;



(2)



int


*Ptr[


5


];


我更喜欢写成



int*


Prt[5];



(3)



int


(


*Ptr


)[


5


];


此文引自网上,出处不详,但是觉得非常好。略改了一点。


< /p>


多维数组一向很难,一般都采用一维数组,但是一旦要用到还真是头疼。

< br>



闲话少说,这里我就以三个二维数组的比较来展开讨论:





(1)



int


**Ptr;




(2)



int


*Ptr[


5


];


我更喜欢写成



int*


Prt[5];




(3)



int


(


*Ptr


)[


5


];




以上三例都是整数的二维数组,都可以用形如



Ptr[


1


][


1


]





方式访问其内容;但它们的差别却是很大的。下面我从四个方 面对它们




进行讨论:





一、内容:





它们本身都是指针,它们的最终内容都是整数。注意我这里说




的是最终内容,而不是中间内容,比如你写



Ptr[


0


]


,对于三者来说,




其内容都是一个整数指针,即



int


*



Ptr[


1


][


1


]


这样的形式才




是其最终内容。





二、意义:





(1)



int


**Ptr


表示指向



一群



指向整数的指针的指针。





(2)



int


*Ptr[


5


]


表示指向



5


个指向整数的指针的指针


,


或者说


P tr



5


个指向



一群



整数


的 指针,


Ptr


是这


5

< br>个指针构成的数组的地址





(3)



int


(


*Ptr


)[


5


]


表示指向


一群



指向



5


个整数数组的指针的指针。





三、所占空间:





(1)



int


**Ptr




(3)



int


(


*Ptr


)[


5


]


一样,在

32


位平台里,


都是


4

< p>
字节,


即一个指针。







(2)



int


*Ptr[


5


]


不同,它是



5


个指针,它占


5


*


4


=


20


个字节的内存空间。





四、用法:





(1)



int


**Ptr




因为是指针的指针,需要两次内存分配才能使用其最终内容。首




先,


Ptr


=


(


int


**


)new


int


*[


5


]


;这样分配好了以后,它和


(2)





意义相同了;然后要分别对



5


个指针进行内存分配,例如:





Ptr[


0


]


=


new


int[


20


];




它表示为第



0


个指针分配



20


个整数,分配好以后,



Ptr[


0


]


为指






20


个整数的数组。这时可以使用下标用法



Ptr[


0


][


0


]





Ptr[


0


][


19


]


了。





如果没有第一次内存分配,该



Ptr


是个





指针,是不能使用




的,如果没有第二次内存分配,则



Ptr[


0


]

< br>等也是个




指针,也




是不能用的。当然, 用它指向某个已经定义的地址则是允许的,那是另外




的用法(类似于



借鸡生蛋


的做法),这里不作讨论(下同)。



例子:



C


语言:



//


动态分配二维数组空间




{




m_iHight=10;//


二维数组的高度




m_i;//


二维数组的宽度




//


动态分配一个二维数组


m_ppTable


内存空间




//


其类型为


int




//m_ppTable


指向该数组





int


**m_ppTable;




m_ppTable=new


int


*[m_iHight];


//


动态 分配


m_iHight


个类型为


int


*


的内存空间




//


分配的是行地址空间





for(int


i=0;i




m_ppTable[i]=


new


int[m_iWidth];



//


动态分配


m_iWidth


个类 型为


int


的内存空间




//


分配的是某行的数值空间




}



//


由此分配的二维数组空间并非是连续的




//


可以使用


m_ppTable[row][col]


来给该二维数组赋值




//


其中



0<=row



//


释放所分配的内存空间




{




for(int


i=0;i




delete[m_iWidth]m_ppTable[i];


//


以行为单位释放数值空间





delete


[m_iHight]m_ppTable;


//


释放行地址空间




}


int


**a;



a=(int


**)calloc(sizeof(int


*),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)


的讨论可知,显然要对其进行 一次




内存分配的。否则就是





指针。

< p>




(3)



int


(


*Ptr


)[


5


]




这种定义我觉得很费解,不是不懂,而是觉得理解起来特别吃力,




也许是我不太习惯这样的定义吧。怎么描述它呢?它的意 义是



一群




指针,每个指针都是指向一个



5


个整数的数组。如果想分配



k


个指针,




这样写:



Ptr


=


(


int


(


*


)[


5


]


)


new


int[


5


*


k


]





这是一次性的内存分配。分配好以后,


Ptr


指向一片连续的地址空间,




其中



Ptr[


0


]


指向第



0




5


个整数数组的首地址,


Ptr[


1


]


指向第




1




5


个整数数组的首地址。





综上所述,我觉得可以这样理解它们:





int


**


Ptr


<==>


int


Ptr[


x


][


y


];




int


*Ptr[


5


]


<==>


int


Ptr[


5


][


x


];




int


(


*Ptr


)[


5


]


<==>


int


Ptr[


x


][


5


];




这里



x




y


是表示若干的意思。



_______ __________________________________________________ ______


1.


C


语言动态分配二维数组



(1)


已知第二维



Code-1



char


(*a)[N];


//


指向数组的指针



a


=


(char


(*)[N])malloc(sizeof(char


*)


*


m);


printf(


sizeof(a));


//4


,指针



printf(


sizeof(a[0])) ;


//N


,一维数组



free(a);


(2)


已知第一维



Code-2



char*


a[M];


//


指针的数组

< br>


int


i;


for(i=0;


i


i++)


a[i]


=


(char


*)malloc(sizeof(char)


*


n);


printf(


sizeof(a));


//4*M


,指针数组



printf(


sizeof(a[ 0]));


//4


,指针



for(i=0;


i


i++)



free(a[i]);


(3)


已知 第一维,一次分配内存


(


保证内存的连续性

)


Code-3



char*


a[M];


//


指针的数组

< p>


int


i;


a[0]


=


(char


*)malloc(sizeof(char)


*


M


*


n);


for(i=1;


i


i++)


a[i]


=


a[i-1]


+


n;

< p>
printf(


sizeof(a));


//4* M


,指针数组



printf(


sizeof(a[0]));


//4


,指针



free(a[0]);


(4)


两维都未知



Code-4



char


**a;


int


i;


a


=


(char


**)malloc(sizeof(char


*)


*


m);


//


分配指针数组



for(i=0;


i


i++)


{


a[i]


=


(char


*)malloc(sizeof(char)


*


n);


//


分配每个指针所指向的数组



}


printf(


sizeof(a));


//4


,指针



printf(


sizeof(a[0]));


//4


,指针



for(i=0;


i


i++)


{


free(a[i]);


}


free(a);


(5)


两维都未知 ,一次分配内存


(


保证内存的连续性


)


Code-5



char


**a;


int


i;


a


=


(char


**)malloc(sizeof(char


*)


*


m);


//


分配指针数组



a[0]


=


(char


*)malloc(sizeof(char)


*


m


*


n);


//


一次性分配所有空间



for(i=1;


i


i++)


{


a[i]


=


a[i-1]


+


n;


}


printf(

< p>
sizeof(a));


//4


,指针

< p>


printf(


sizeof(a[0]));


//4


,指针



free(a[0]);


free(a);


2.C++


动态分配二维数组



(1)


已知第二维



Code-6



char


(*a)[N];


//


指向数组的指针



a


=


new


char[m][N];


printf(

sizeof(a));


//4


,指针


printf(


sizeof(a[0]));


//N


,一维数组



delete[]


a;


(2)


已知第一维



Code-7



char*


a[M];


//


指针的数组

< br>


for(int


i=0;


i


i++)



a[i]


=


new


char[n];


printf(


s izeof(a));


//4*M


,指针数组

< br>


printf(


sizeof(a[0]));


//4


,指针



for(i=0;


i


i++)



delete[]


a[i];

-


-


-


-


-


-


-


-



本文更新与2021-02-08 03:13,由作者提供,不代表本网站立场,转载请注明出处:https://www.bjmy2z.cn/gaokao/611640.html

二维数组定义以及动态分配空间的相关文章

  • 余华爱情经典语录,余华爱情句子

    余华的经典语录——余华《第七天》40、我不怕死,一点都不怕,只怕再也不能看见你——余华《第七天》4可是我再也没遇到一个像福贵这样令我难忘的人了,对自己的经历如此清楚,

    语文
  • 心情低落的图片压抑,心情低落的图片发朋友圈

    心情压抑的图片(心太累没人理解的说说带图片)1、有时候很想找个人倾诉一下,却又不知从何说起,最终是什么也不说,只想快点睡过去,告诉自己,明天就好了。有时候,突然会觉得

    语文
  • 经典古训100句图片大全,古训名言警句

    古代经典励志名言100句译:好的药物味苦但对治病有利;忠言劝诫的话听起来不顺耳却对人的行为有利。3良言一句三冬暖,恶语伤人六月寒。喷泉的高度不会超过它的源头;一个人的事

    语文
  • 关于青春奋斗的名人名言鲁迅,关于青年奋斗的名言鲁迅

    鲁迅名言名句大全励志1、世上本没有路,走的人多了自然便成了路。下面是我整理的鲁迅先生的名言名句大全,希望对你有所帮助!当生存时,还是将遭践踏,将遭删刈,直至于死亡而

    语文
  • 三国群英单机版手游礼包码,三国群英手机单机版攻略

    三国群英传7五神兽洞有什么用那是多一个武将技能。青龙飞升召唤出东方的守护兽,神兽之一的青龙。玄武怒流召唤出北方的守护兽,神兽之一的玄武。白虎傲啸召唤出西方的守护兽,

    语文
  • 不收费的情感挽回专家电话,情感挽回免费咨询

    免费的情感挽回机构(揭秘情感挽回机构骗局)1、牛牛(化名)向上海市公安局金山分局报案,称自己为了挽回与女友的感情,被一家名为“实花教育咨询”的情感咨询机构诈骗4万余元。

    语文