new int*[2]和new (int *)[2] 的区别???

GoForSky 2009-03-09 10:23:54
一个2级指针的动态分配
int **p;
p=new int*[2];

这里p=new int*[2]等价p=new(int *)[2]吗???
我觉得应该等价

double *p;
p=new double [2];
把double换成 int *;
不就是:
int **p
p=new (int *)[2];吗???
...全文
598 24 打赏 收藏 转发到动态 举报
写回复
用AI写文章
24 条回复
切换为时间正序
请发表友善的回复…
发表回复
GoForSky 2009-03-11
  • 打赏
  • 举报
回复
int **p2Ary = new int*[n]; //-----> 改为 int **p2Ary = new (int*)[n];--编译通不过(VC6+BC6) why?????

for(int i = 0; i < n; i++)
{
p2Ary[i] = new int[m];
for(int j = 0; j < m; j++)
cin >> p2Ary[i][j];
}

for(int i = 0; i < n; i++)
delete []p2Ary[i];

delete []p2Ary;
shy_xiaoxiao 2009-03-11
  • 打赏
  • 举报
回复
忽略这个贴,发错地方了。。。。。。。。。

[Quote=引用 19 楼 shy_xiaoxiao 的回复:]
明白了,当T是int[5]的时候
new T 就等于 new int[5], 得到的肯定是一个int*
所以当T是一个数组类型的时候,new T似乎有些二义性

好像快要可以结贴了,呵呵
[/Quote]
shy_xiaoxiao 2009-03-11
  • 打赏
  • 举报
回复
明白了,当T是int[5]的时候
new T 就等于 new int[5], 得到的肯定是一个int*
所以当T是一个数组类型的时候,new T似乎有些二义性

好像快要可以结贴了,呵呵
chenzhp 2009-03-11
  • 打赏
  • 举报
回复
[Quote=引用 15 楼 shy_xiaoxiao 的回复:]
p=new int*[2] 和 p=new(int *)[2] 不是等价的

前者p是一个数组,该数组的元素类型是int*,数组大小是2,++p将前进sizeof(int*)也就是4个字节
后者p是一个指针,该指针指向一个大小为2的int数组,++p将前进sizeof(int[2])也就是8个字节

因为数组也可以理解为指针,所以两者都表示一个地址,但类型不不一样
[/Quote]
shy_xiaoxiao 2009-03-11
  • 打赏
  • 举报
回复
说前者p是个数组好像也不太严谨,严格来说这里p是个指针,指向一个数组的首地址,呵呵

[Quote=引用 15 楼 shy_xiaoxiao 的回复:]
p=new int*[2] 和 p=new(int *)[2] 不是等价的

前者p是一个数组,该数组的元素类型是int*,数组大小是2,++p将前进sizeof(int*)也就是4个字节
后者p是一个指针,该指针指向一个大小为2的int数组,++p将前进sizeof(int[2])也就是8个字节

因为数组也可以理解为指针,所以两者都表示一个地址,但类型不不一样
[/Quote]
amossavez 2009-03-11
  • 打赏
  • 举报
回复
同意楼上的说话
shy_xiaoxiao 2009-03-11
  • 打赏
  • 举报
回复
p=new int*[2] 和 p=new(int *)[2] 不是等价的

前者p是一个数组,该数组的元素类型是int*,数组大小是2,++p将前进sizeof(int*)也就是4个字节
后者p是一个指针,该指针指向一个大小为2的int数组,++p将前进sizeof(int[2])也就是8个字节

因为数组也可以理解为指针,所以两者都表示一个地址,但类型不不一样
elpep 2009-03-11
  • 打赏
  • 举报
回复

new (int *)[2];这句在VC中,编译错误.
(int *)强制类型转换,无法确定分配的类型和尺寸
elpep 2009-03-11
  • 打赏
  • 举报
回复
[Quote=引用 15 楼 shy_xiaoxiao 的回复:]
p=new int*[2] 和 p=new(int *)[2] 不是等价的

前者p是一个数组,该数组的元素类型是int*,数组大小是2,++p将前进sizeof(int*)也就是4个字节
后者p是一个指针,该指针指向一个大小为2的int数组,++p将前进sizeof(int[2])也就是8个字节

因为数组也可以理解为指针,所以两者都表示一个地址,但类型不不一样
[/Quote]

按你说:
p=new (int *)[2]
后者p是一个指针,该指针指向一个大小为2的int数组,++p将前进sizeof(int[2])也就是8个字节.

则下2个程序编译错误:
int (*p)[2];
p=new (int *)[2];

int (**p)[2];
p=new (int *)[2];
(int *)是强制转换:

比如:
1:
void main()
{
int *p;
}
可以

2:

typedef int* TYPE;

void main()
{
TYPE p;
}
//ok

3:
typedef (int *)TYPE//error

强制转换不是类型

elpep 2009-03-11
  • 打赏
  • 举报
回复
int(*p) 把p指针指向的数据强制转化成int型。
int *p 就试指针p的定义,定义了一个指向int型数据的指针。
(int *)p 是强制把p(不管原来是什么类型的)转化成指向整形数据的指针。

int *p[25];是定义了一个数组,数组名是p,这个数组是由25个指向int型数据的指针组成的。
int (*p)[25];是定义了一个指针p,它指向的是一个25个int型大小的数组。在这里p+1其实是走了25*sizeof(int)个字节。

(int *)[2]的(int *)就是强制转换指针的意思。
GoForSky 2009-03-11
  • 打赏
  • 举报
回复
[Quote=引用 17 楼 shy_xiaoxiao 的回复:]
说前者p是个数组好像也不太严谨,严格来说这里p是个指针,指向一个数组的首地址,呵呵

引用 15 楼 shy_xiaoxiao 的回复:
p=new int*[2] 和 p=new(int *)[2] 不是等价的

前者p是一个数组,该数组的元素类型是int*,数组大小是2,++p将前进sizeof(int*)也就是4个字节
后者p是一个指针,该指针指向一个大小为2的int数组,++p将前进sizeof(int[2])也就是8个字节

因为数组也可以理解为指针,所以两者都表示一个地址,但…
[/Quote]

后者p是一个指针,该指针指向一个大小为2的int数组,++p将前进sizeof(int[2])也就是8个字节 :
为什么这么理解呢???

new一般就是new 类型[个数];这里类型为(int *),个数2.结果new (int *)[2];应该就是分配了两个空间,类型是int *;
为什么不对呢????

new (int *)[2],怎么理解,才能像你说的那样呢
jakqigle 2009-03-10
  • 打赏
  • 举报
回复
等价的。
二维数组动态申请与内存释放:
int **p2Ary = new int*[n];

for(int i = 0; i < n; i++)
{
p2Ary[i] = new int[m];
for(int j = 0; j < m; j++)
cin >> p2Ary[i][j];
}

for(int i = 0; i < n; i++)
delete []p2Ary[i];

delete []p2Ary;
jojotom 2009-03-09
  • 打赏
  • 举报
回复
等价的了,加了括号更好些吧
pengzhixi 2009-03-09
  • 打赏
  • 举报
回复
等价
hongpan00 2009-03-09
  • 打赏
  • 举报
回复
嗯,相当于new一个指针数组的元素给这个二级指针
mabo321 2009-03-09
  • 打赏
  • 举报
回复
一样
sherrik 2009-03-09
  • 打赏
  • 举报
回复
up~
lingyin55 2009-03-09
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 lingyin55 的回复:]
不能这样理解,应该从运算符的优先级和结合性去看。
[/Quote]

嗯,是等价的,我错了。看到的时候我觉得应该是从运算符的结合性和优先级去考虑,但是这里的p=new int*[2]等价p=new(int *)[2]是等价的,相当于
声明一个2个元素的数组,数组每个元素都是一个int *指针,因此每个元素还可以单独的申请空间。

ps:这次应该不会错了吧?各位指正啊。
mengde007 2009-03-09
  • 打赏
  • 举报
回复
楼上你认为应该怎样理解!
lingyin55 2009-03-09
  • 打赏
  • 举报
回复
不能这样理解,应该从运算符的优先级和结合性去看。
加载更多回复(4)

64,646

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧