-
二维数组定义以及动态分配空间
(
转
)
下面三种定义形式怎么理解?怎么动态分配空间?
(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
字节,
即一个指针。
但
(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>等也是个
野
指针,也
是不能用的。当然,
用它指向某个已经定义的地址则是允许的,那是另外
的用法(类似于
借鸡生蛋
的做法),这里不作讨论(下同)。
例子:
-
-
-
-
-
-
-
-
-
上一篇:1553B总线测试分析系统.doc
下一篇:二维数组定义以及动态分配空间