1.有如下说明语句:
int a[10] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
int *p = a;
则数值为9的表达式是()
正确答案: B
解析:p是指针,指向数组的首地址,p+8即是第八个元素的地址,加个*即地址中存放的值。
2.下列程序的打印结果是?
char p1[15] = "abcd", *p2 = "ABCD", str[50] = "xyz";
strcpy(str + 2, strcat(p1 + 2, p2 + 1));
printf("%s", str);
正确答案: D
解析:char* strcpy(char *dest,char *src);将从src开始包含'\0'的字符串拷贝到以dest开始的位置,进行覆盖
char* strcat(char *dest,char *src);将src开始的字符串添加到dest字符串的末尾(覆盖dest的\0")
两者都返回指向dest的指针。
3.关于引用与指针的区别,下面叙述错误的是:
A:引用必须被初始化,指针不必。
B :指针初始化以后不能被改变,引用可以改变所指的对象。
C:删除空指针是无害的,不能删除引
D:不存在指向空值的引用,但是存在指向空值的指针。
答案:D
解析:
指针在建立后会被分配一块空间,用于存储其所指向的地址,因为指针是有对应内存空间的,因此指针值(指向的内存空间)是可以改变的;而引用则不行,引用没有内存空间,仅仅是被引对象内存空间的别名,改变引用如&a=4实际上等价于a=4,改变的是被引对象的值,不改变该引用所指的内存空间;
指向空值的引用是没有意义的(因为引用对象不能改变,也就是这个引用永远指向null,那这个引用根本就没有存在的必要);指向空值的指针是有意义的,尤其在指针被删除后,如果不对指针进行赋值,则指针的值将会由系统随机指定,这样后续如果有对指针的操作的话,将会带来很大的风险。因此指针被删除后必须赋值为null;
因为引用无法改变,因此不进行初始化的引用没有意义;因为指针可以改变,因此指针可以不进行初始化,可以在后续程序中动态改变;
4.数组定义为“ int a[4];”,表达式 ( ) 是错误的。
A:*a
B:a[0]
C:a
D:a++
正确答案: D
解析:a代表数组名或者内存连续区域第一块数据的地址。接[]表示基址寻址。加*表示对数组起始位置按照数组元素数据类型寻址取值第一个元素。加&表示取第一个元素地址。a与&a与&a[0]相同。a为常量,可以运算,不可赋值。
5.若有定义 int a[3][5], i, j; (且 0≤i<3, 0≤j<5),则 a[i][j] 不正确的地址表示是()。
A:&a[i][j]
B:a[i]+j
C:*(a+i)+j
D:*(*(a+i)+j)
正确答案:D
6.代码段
1 2 |
|
则sum=21。请问这句话的说法是正确的吗?
答案:正确
解析:
a[3][3]={{3,5},{8,9},{12,35}};
一维数组没有初始化的值默认初始化为0,
即:a[3][3]={{3,5,0},{8,9,0},{12,35,0}};
sum = a[0][2]+a[1][1]+a[2][0] = 0+9+12 = 21。
7.
有变量
1 2 3 4 5 |
|
char是1字节,int是4字节,若按4字节对齐,那么sizeof(rec)等于()
A:15
B:16
C:18
D:20
答案:D
解析:要符合最大字节原则 char要用int字节数 char数组要是int 4个字节的倍数 4+4+12=20
8.下面代码的循环次数为()
1 2 3 4 |
|
A:300
B:299
C:301
D:无限循环
答案:D
解析:char类型占据一个字节,8位,2^8所以能表示256个数据,而unsigin char表示没有符号位,所以能表示的数据范围位0~255,在这种前提下,所以选D
9.
请问下面的程序最后会产生多少个进程:
1 2 3 4 5 6 7 8 9 10 11 12 13 |
|
A:5
B:10
C:15
D:32
答案:D
解析:
i=0时,共有两个进程: 主进程和主进程创建的第一个进程
i=1时,以上两个进程分别创建新的进程,此时共有四个进程
i=2时,以上四个进程分别创建新的进程,此时共有8个进程
....
依次类推, 当i=n时,共创建2^(n+1)个进程
10.
有如下程序段:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
|
则程序输出:
A:~C()~B()~A()
B:~C()~A()~B()
C:A)B)都有可能
D:以上都不对
正确答案:D
解析:
答案解析:创建一个类对象c,然后动态类型转换,让一个B *b1指针指向c,再一次动态类型转换,让一个基类A *a2指针指向b1,当delete a2时,调用析构函数,但是基类A的析构函数不是虚函数,所以只调用A的析构函数,结果应该是:~A()