int *s=new int[r] 这也行?(r 不是常量!!!)

wangjie1986 2009-02-24 03:30:00
int r=9;
int a[r];//错误,因为数组定义时不能给变量!

int *s=new int(9)//这个正确性还明白

int r=9;
int *s=new int[r]//这个的正确性就实在摸不着头脑了!!!难道这个不是分配连续的数组空间吗,怎么可以用变量呢!!!





...全文
271 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
hua_zhixing_ 2009-04-15
  • 打赏
  • 举报
回复
学习
insulted 2009-02-24
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 wangjie1986 的回复:]
动态分配就放弃决定数组大小吗,我尝试了下如果我的r不初始化也能够运行,但是这样会死机! 真不知道它的编译原则是什么,这种错误怎么能够放过呢?
另外还想问个问题! C++中的常函数成员,除了可以用于函数重载以及供常对象调用以外还有啥做用,我看书上好多代码都用的常函数,一不涉及重载,二不是常函数调用,那为什么还偏偏喜欢用常函数呢?
[/Quote]

一般来说,任何一个类如果期望被广泛使用,就应该把那些不修改类数据成员的成员函数声明为const成员函数。

1). 关键字const的作用是为给读你代码的人传达非常有用的信息,实际上,声明一个参数为常量是为了告诉了用户这个参数的应用目的。如果你曾花很多时间清理其它人留下的垃圾,你就会很快学会感谢这点多余的信息。(当然,懂得用const的程序员很少会留下的垃圾让别人来清理的。)
2). 通过给优化器一些附加的信息,使用关键字const也许能产生更紧凑的代码。
3). 合理地使用关键字const可以使编译器很自然地保护那些不希望被改变的参数,防止其被无意的代码修改。简而言之,这样可以减少bug的出现。
wangjie1986 2009-02-24
  • 打赏
  • 举报
回复
谢谢各位,学习了!
lgccaa 2009-02-24
  • 打赏
  • 举报
回复
都分析得很清楚了

数组和指针是不同的
  • 打赏
  • 举报
回复
又看到这个问题了.
第一个int a[r];//错误,因为数组定义时不能给变量!,C语言教导我们这就是错的,它来自程序堆区.

int *s=new int[r],分配栈区,只要数值确定,r是变量也没关系.
dongpy 2009-02-24
  • 打赏
  • 举报
回复
[Quote=引用楼主 wangjie1986 的帖子:]
int r=9;
int a[r];//错误,因为数组定义时不能给变量!

int *s=new int(9)//这个正确性还明白

int r=9;
int *s=new int[r]//这个的正确性就实在摸不着头脑了!!!难道这个不是分配连续的数组空间吗,怎么可以用变量呢!!!
[/Quote]

int a[r];和int *s=new int[r]都是分配连续内存,但是分配时期不同。

前者是在编译时分配,所以编译器要求长度是常数;后者是在运行时分配,当然可以是变量。
tangshuiling 2009-02-24
  • 打赏
  • 举报
回复

如果楼主对new的机制有所了解也就不会有此一问!
c++中的new形式分为以下几种:
void* operator new(size_t size) throw();
void* operator new(size_t size) throw std:bad_alloc;
void* operator new(size_t size,void* buffer) throw();
.........

不管从那种形式来看,new都是一种函数形式,对函数传参(不论变量还是常量)都不会有任何的问题
但数组不同,数组必须在声明的同时就初始化,换句话来说,数组在预编译时期就需得到其占有的内存长度
而变量是runtime时期才能确定其值。因此,数组不能用变量确定其长度,而new作为一种函数的形式
接受可变的形参完全符合逻辑 (以上的解释排除符合c99标准的编译器版本)
sxbwelcome 2009-02-24
  • 打赏
  • 举报
回复

C语言规定,定义数组的形式为:
类型名 数组名[常量表达式] ……这是静态数组
而用new可以实现动态数组,形式为:
指针变量=new 类型名[下标表达式] ……任何一个整型表达式,可以使用变量
太乙 2009-02-24
  • 打赏
  • 举报
回复
我汗~~这……
bfhtian 2009-02-24
  • 打赏
  • 举报
回复
int a[r];//错误,因为数组定义时不能给变量!
因为是编译时还不知道r的值,而数组是静态绑定的。
wangjie1986 2009-02-24
  • 打赏
  • 举报
回复
动态分配就放弃决定数组大小吗,我尝试了下如果我的r不初始化也能够运行,但是这样会死机! 真不知道它的编译原则是什么,这种错误怎么能够放过呢?
另外还想问个问题! C++中的常函数成员,除了可以用于函数重载以及供常对象调用以外还有啥做用,我看书上好多代码都用的常函数,一不涉及重载,二不是常函数调用,那为什么还偏偏喜欢用常函数呢?
waizqfor 2009-02-24
  • 打赏
  • 举报
回复

int *s=new int[r]//动态分配一个长度为r 整型数组 地址给S
int *s=new int(9)//动态分配内存 int类型 并初始化为9 地址给S
Dinelgua 2009-02-24
  • 打赏
  • 举报
回复
int r=9;
int *s=new int[r]//这个的正确性就实在摸不着头脑了!!!难道这个不是分配连续的数组空间吗,怎么可以用变量呢!!!

由于是动态分配,编译器自然把决定数组大小责任放弃了,反正动态分配的编译器也管不了
符合语法就编译过了

且在真正new这个int数组的时候 r的大小已经确定,所以new时知道数组多大就ok了

另 new int(9)不是创建数组,使创建一个被初始化为9的整数
pengzhixi 2009-02-24
  • 打赏
  • 举报
回复
int *s=new int(9)//动态分配一个int类型变量的空间并且初始化为9,返回的地址赋给指针s
int *s=new int[r]//动态分配一个int类型的数组,该数组能保存r个int数据,并返回地址给s
lingyin55 2009-02-24
  • 打赏
  • 举报
回复
mark 学习了
fox000002 2009-02-24
  • 打赏
  • 举报
回复
new 用于动态内存分配

与普通数组不同

int *s=new int(9)// 分配单个 int 内存空间

int r=9;
int *s=new int[r]// 分配 r 个 int 内存空间
diannaomingong 2009-02-24
  • 打赏
  • 举报
回复
在执行int *s=new int[r]前r有确实的值了,至少逻辑上可以的。
在某些语言编译器就不行,我试过这么干,一直觉得数组要事先估计好大小很傻,还是向量好。

65,211

社区成员

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

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