首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

小弟我的C++primer习题答案的迷惑

2012-03-27 
我的C++primer习题答案的迷惑练习2。1为什么内置数组类型不支持数组之间的赋值,支持这种操作需要什么信息!

我的C++primer习题答案的迷惑
练习2。1

为什么内置数组类型不支持数组之间的赋值,支持这种操作需要什么信息!
我的答案:
是因为内置数组是一种数据结构,结构化编程数据和算法是分离的,所以数组不能对自己做出任何有意义的动作;要支持这种操作,数组第一要知道自己的长度,第二自己知道每个元素的位置,第三能运用算法遍历每个元素。

候杰译标准答案:
数组名,其实代表着一个常量指针,所以将一个数组,好像是将常量5赋值给常量3一样,虽然语法正确,但在语意层面上会产生错误。
c++语言并示支持数组的赋值操作,编译器必须在执行时期知道数组的长度,才能产生程序代码,支持数组对数组的赋值操作。

我的迷惑:定义数组必须指定类型长度,在执行的时候可以为期分配内存空间。
我想知道,在执行的时候到底知道不知道数组的长度?如果知道了长度,按标准答案的说法,应该能支持数组之间的赋值操作?

[解决办法]
个人认为执行的时候数组不知道自己的长度,定义的时候指定大小,一次性分配内存之后,长度信息就丢失了。
[解决办法]
对啊。内存是要确定并分配的,但C++并没有什么好记录下它的长度。所以要靠程序员保证所使用的不能越界就是这个道理。
[解决办法]
编译器必须在执行时期知道数组的长度,数组名,代表常量指针,指针可以被改变,指向的内容不能被改变
[解决办法]

探讨
按一楼的说法,我是不是可以这样? 

int a[8]; 
double *pd=a; 

for (i=0;i <4;i++) 

pd[i]=3.14159265; 


[解决办法]
关于这一点,因为cpp需要兼容c
所以编译器是将 数组名 看作指针的.

int a[8];
int b= a[-1]; //合法语句
int c= a[8]; //合法语句

有些程序利用了这种惊险的越界特性来完成一些工作.
cpp为兼容c,被要求能支持上面的语句.

另外一个旁证,如果你在一个class中 重载 operator *,那么你可以用[]来调用它.
class a
{
public:
operator int *(){return 2;}
};
a b;
int k = b[0]; // 结果 k =2;

[解决办法]
很遗憾,实际上只有在定义数组的时候编译器才知道其长度,因为要分配确切的内存空间
在你使用数组的时候,是编译器是不知道数组长度的,也就是说,C++不提供数组越界检查
就算知道数组长度,怎么相互赋值?长度不一样的情况,和长度一样的情况怎么区分?

热点排行