目录
1有.以下代码段
2.下列程序,若输入字符串abc,则函数f的功能是将字符串abc转换为*abc输出,请为横线处选择合适的程序( )
3. 以下定义中,指向数组的指针P的是()
4.在一个16位的机器,以下结构由于边界对齐浪费了多少空间()
5.若一个类中含有纯虚函数,则该类称为()
6.以下关于指针的说法,正确的是()
7.程序的输出是()
8.在Windows 32位操作系统中,假设字节对齐为4,对于一个空的类A,sizeof(A)的值为()?
9.下面有关new/delete和malloc/free的区别,描述错误的是?
1.有以下代码段
char a[] = {'a','b','c'};
char b[] = {"abc"};
数组a和数组b占用的内存空间大小不一样。请问这句话的说法是正确的吗?
答案:正确。
解析:数组a包含三个元素,数组b包含四个元素,因为字符串加了' '。
2.下列程序,若输入字符串abc,则函数f的功能是将字符串abc转换为*abc输出,请为横线处选择合适的程序( )
void f(char str[5]) {
int i = strlen(str) - 1;
while (i >= 0) {
str[i + 1] = str[i];
i--;
}
_________________;
printf("%sn", str);
}
答案:str[i+1]='*'
解析:很明显是str[0]='*', 但是题中没有这个选项,我们分析之后可以发现执行完while循环之后i的值变为-1,而str[i+1]=str[0]='*',
3. 以下定义中,指向数组的指针P的是()
答案:A
解析:
A:数组指针
B:指针数组
C:强制类型转换
D:定义错误
所以选A
补充:区分int *p[n]; 和int (*p)[n]; 就要看运算符的优先级了。
int *p[n]; 中,运算符[ ]优先级高,先与p结合成为一个数组,再由int*说明这是一个整型指针数组。
int (*p)[n]; 中( )优先级高,首先说明p是一个指针,指向一个整型的一维数组。
4.在一个16位的机器,以下结构由于边界对齐浪费了多少空间()
struct{
char a;
int b;
char c;
}
答案:2
解析:
本题是16位机器,char型占1个字节,int型占2个字节。
结构体中字节对齐有两条规则:
- 数据成员自对齐,即数据成员起始地址为数据类型长度的整数倍,如该题int型b只能从0,2,4...等地址处开始放;
- 结构体总长度是结构体中有效对齐值的整数倍,有效对齐值,如该题没明确指出,则为最长数据成员(int b)长度的整数倍;
根据上面两条规则,画出内存示意图。根据规则1,int b从2处开始放,此时结构体总长度为(1 + 1 + 2 + 1 = 5);再根据规则2,结构体总长度应为2的整数倍,故应为6.描红的两个字节表示被浪费的。
5.若一个类中含有纯虚函数,则该类称为()
答案:抽象类
解析:一个类中存在虚函数,该类就是抽象类。
6.以下关于指针的说法,正确的是()
答案:C
解析:
那如何区分这几类呢? 带两个const的肯定是指向常量的常指针,很容易理解,主要是如何区分常量指针和指针常量:
一种方式是看 * 和 const 的排列顺序,比如
int const* p; //const * 即常量指针
const int* p; //const * 即常量指针
int* const p; //* const 即指针常量
还一种方式是看const离谁近,即从右往左看,比如
int const* p; //const修饰的是*p,即*p的内容不可通过p改变,但p不是const,p可以修改,*p不可修改;
const int* p; //同上
int* const p; //const修饰的是p,p是指针,p指向的地址不能修改,p不能修改,但*p可以修改;
7.程序的输出是()
void main (void) {
double x=28;
int r;
r= x%5;
printf ("r=%dn", r);
}
答案:编译错误
解析:%取余运算符只能用于整形
8.在Windows 32位操作系统中,假设字节对齐为4,对于一个空的类A,sizeof(A)的值为()?
答案:1
解析:类的实例化是在内存中分配一块地址,每个实例在内存中都有独一无二的二地址。同样,空类也会实例化,所以编译器会给空类隐含的添加一个字节,这样空类实例化后就有独一无二的地址了。所以,空类的sizeof为1,而不是0. 多重继承的空类的大小也是1.
9.下面有关new/delete和malloc/free的区别,描述错误的是?
答案:C D
解析:
malloc/free和new/delete的本质区别:
1.malloc/free 是C/C++语言的标准库函数,new/delete是C++的运算符
2.new 能自动分配空间大小
3.对于用户自定义的对象而言,用malloc/free无法满足动态管理对象的要求
对象在创建的时候会自动调用构造函数,对象在消亡之前自动执行析构函数
由于malloc/free是库函数而不是运算符,不在编译器的控制范围,不能把构
造函数和析构函数的任务强加于malloc/free 。一次C++需要一个能够对对象完
成动态分配内存和初始化工作的运算符new,以及一个释放内存的运算符
delete。简单来说就是new/delete能完成跟家详细的对内存的操作,而malloc/
free不能。



