c++的一些题目问题

1.已知char str1[8],str2[8]={"good"};为什么str1=str2;是错误的赋值?
2.函数原型为fun(int (*p)[3],int),调用形式为fun(a,2),为什么a的定义可以为a[][3]!喔不太懂这题目意思!能解析下吗?
3.struct st{int no;char name[15];}s1;为什么s1所占内存空间为sizeof(s1),不是sizeof(int no;char name[15)的和吗?有什么区别啊!?
4.定义const char *p="ABC";为什么p=NULL可以赋值啊!而char *q=p是错误?
5.为什么const int a[4]={1,2,3};和const int temp;都是错误的??

1、char str1[8],str2[8]={"good"}; str1=str2;
编译时报错:error: ISO C++ forbids assignment of arrays
解释:C++不允许这样对数据进行赋值。其实原因很简单,数组名相当于一个指向常量指针,如此例中str1中存的就是str1[0]的地址。如果你让str1指向str2的话,那么就会出现内存泄露,所以编译器禁止了你这么干。

2、fun(int (*p)[3],int),很明显这是一个函数。第一个参数为int (*p)[3],第二个参数为int.这里重点解释一下第一个参数。int (*p)[3]表示一个指向int[3]数组的指针。而int a[][3]表示一个两维数组,其第一维个数固定为3,第二维个数不定,前面已经说过,数组名其实就是一个指向常量的指针。所以int [][3]可以赋值给int(*p)[3],反之是不可以的。

3、这个问题涉及对内存对齐。现在一般的计算机字长都是32位,CPU可以一次处理4个字节,所以编译器在编译时为提高处理速度会对数据的存诸做优化。例如:struct st{int a;char b; int c;}这个结构,int占用4个字节,char 占用1个字节,分别来看应该一共9个字节,但是合成一个结构,却是12个字节,多余的3个字节是为了将b填补成为4个字节。当然也可以用预编译指令禁止编译器自身的这种优化,以达到节省空间的目的。

4、const char *p表示p是一个指向常量的一个指针,即其内容是不可通过*p改变的,但是p本身是可以改变的,所以可以让p指向NULL。char *q = p这是类型转换的错误,你试图把一个const char*赋值给char*,这个操作是危险的,因为你可以通过改变*q来改变*p。而*p是常量,是不允许被改变的。所以编译器抛出了错误。你可以使用强制类型转换,但不建议这么做。

5、都是没有初始化的错误。用const 定义的常量必须在声明的时候同时初时化。
温馨提示:答案为网友推荐,仅供参考
第1个回答  2010-05-26
1.str1是地址常量
2.(*p)[3] 与二维数组p[][3] 等价
3.是以sizeof(int)的整数倍分配空间的
4.q 为非 const型
5.未赋值(常量必须均赋值)
第2个回答  2010-05-26
1、因为数组名代表的是数组的首地址
strcpy(str1,str2)可以了
2 因为它是二维数组,a的定义可以为a[][3]
就相当于 定义一维数组时:a[]={1,2,4}
前面一个是行指针,(*p)[3]是一个行指针
3、sizeof(s1)=sizeof(s1.no)+...
是他们的,但是不能那样写
4、const char *p=NULL 是这定义一个空指针,
而*q=p不对,因为指针不能直接赋值,p是一个数组名
5、int const a[4]={1,3,4};
int const temp;
第3个回答  2010-05-26
1、数组名不能互相赋值,不允许
2、int (*p)[3]等价于 p[][3]都是指向一个一维数组的数组(指针)
3、C语言要求内存对其,通常情况是向最大的长度对齐,这里最大的单元长度是int(4字节)所以 char也要向int(4字节)对齐,所以char name[15]实际占用16字节

4、const char *p,是不允许通过p操作其指向的对象,比如*p,但对p自身的赋值是允许的
5、因为const要求给初始值,不给初始值就是错误的!
第4个回答  2010-05-26
1、数组名是一个指针常量,它不能再指向其他的东东,但可以改变所指向的东东的值,当指针是常量的时候,他就要初始化,以后就不可以改变他去指向别的内存,但是可以改变他所指的内容。 所以这样赋值是不对的。

2、int (*p)[3]表示p指的是一个数组,p+1与p的差距是sizeof(int[3]),是移动指到另一个数组,a[][3] 等价于 (*p)[3]

3、sizeof(s1)为20, sizeof(int)+sizeof(char[15],)为19。不过VC的sizeof运算符在计算class、struct和union类型的时候,会把对齐用的填充字节也算进去。默认是按4字节(word)对齐,所以其结果一定可以被4整除。所以结果为20。

4、p和q的类型不一样。无法从“const char *”转换为“char *” ,p=NULL;空值赋值是允许的。

5、const int a[4]={1,2,3}这个可以通过啊,第四个默认为0而已,const int temp必须初始化常量对象。
相似回答