社区
C++ 语言
帖子详情
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];吗???
...全文
670
24
打赏
收藏
new int*[2]和new (int *)[2] 的区别???
一个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];吗???
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用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)
int
*p和(
int
*)p的
区别
;返回多个值给主函数的做法;
int
*p=
new
int
[n]的用法;
int
*p = (
int
*)malloc(n*sizeof(
int
))的含义
int
*p和(
int
*)p的
区别
(
int
**)p;//强制将变量p转换成指向
int
类型指针变量的 指针(转换后p是指向指针的指针) (
int
*) *p;//强制将变量 *p 转换成指向
int
类型的指针变量,(*p当成整体做强制转换,这么看来,p也可能是一个指向指针的指针) *(
int
)p;//强制将变量p转换成指向
int
类型变量的指针,再取这个指针变量指向的值;相当于((
int
...
int
*p1 =
new
int
[10];
int
*p2 =
new
int
[10]();
区别
下面描述正确的是
int
*p1 =
new
int
[10];
int
*p2 =
new
int
[10](); p1和p2申请的空间里面的值都是随机值 p1和p2申请的空间里的值都已经初始化 p1申请的空间里的值是随机值,p2申请的空间里的值已经初始化(对) p1申请的空间里的值已经初始化,p2申请的空间里的值是随机值 解释 在C++primer(第5版)中关于
int
*与(
int
*)的
区别
晚上被问到一个C++的问题:
int
**pa=
new
int
* [5];
int
*pb=
new
(
int
*)[5]; 上面两行代码的
区别
是什么? 分析与实验结果如下: (1)第一行代码可以在VS2010上正常运行,
new
出来的是一个存放
int
型指针变量的数组,可以存放5个这样的元素。 而第二行代码则编译错误,悲剧的是VS2010在编译之前并未红线提示错误。 (2)设计了如
int
*p1 =
new
int
[10];
int
*p2 =
new
int
[10]();
区别
下面描述正确的是
int
*p1 =
new
int
[10];
int
*p2 =
new
int
[10](); p1和p2申请的空间里面的值都是随机值 p1和p2申请的空间里的值都已经初始化 p1申请的空间里的值是随机值,p2申请的空间里的值已经初始化(对) p1申请的空间里的值已经初始化,p2申请的空间里的值是随机值 解释 在C++primer(第5版)中关于
new
的讨论有: 1、
new
当个对象
new
在自由空间分配内存,但其无法为其分配的对象命名,因次是无名的,分配之后返回一个指向该对象的指针。.
C++中
int
a[10]和
int
* a=
new
int
[10]]有什么
区别
我们常常看见,在图论中,对一个Graph类在初始化的时候,对类的成员变量**arc(邻接矩阵,是一个二维数组,大小是顶点数*顶点数,存储内容为边的权值,而且矩阵的对角线元素均为0),有如下的初始化方法://构造函数 Graph_DG::Graph_DG(
int
vexnum,
int
edge) { //初始化顶点数和边数 this->vexnum = vexnum; this->...
C++ 语言
65,211
社区成员
250,514
社区内容
发帖
与我相关
我的任务
C++ 语言
C++ 语言相关问题讨论,技术干货分享,前沿动态等
复制链接
扫一扫
分享
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++
技术论坛(原bbs)
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
请不要发布与C++技术无关的贴子
请不要发布与技术无关的招聘、广告的帖子
请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下
试试用AI创作助手写篇文章吧
+ 用AI写文章