1.【单选题】
void swap (int a,int b)
{
a = a ^ b;
b = a ^ b;
a = a ^ b;
}
int a {120},b {130};
swap{a,b};
a=? b=?
A 120,130 B 130,120 C130,0
解析:这道题中,函数体的内容是交换两个变量的值,采用的是位运算的方法,但因为传递的参数是值传递,所以并不能改变实参的值,所以选A。
2.【单选题】
void Add (int* a,int * b)
{
a = b;
}
int a = 250,b = 350;
int* pa = &a;
Add ( pa, &b);
Pa[0] = ?
A 350 B 250 C 0
解 析:这道题比较难,很多人会选择A,但是这是的错误的选项,正确答案是B。函数体内部指针 a 等于指针 b,但是 a 仍然是一个局部变量,和它传入的指针 pa 并没有什么关系,仍然是值传递,无法改变变量的值。
3.【单选题】
void Add (int* &a, int *b)
{
a = b;
}
int a = 250, b = 350;
int* pa = &a;
Add ( pa, &b);
Pa [0] = ?
A 350 B 250 C 0
解析:这道题和上道题一样,只不过这次函数的形参为变为了 指针的引用,这个时候指针形参 a 就相当于 pa 的别名,a 可以改变 pa 的值,所以这道题选A。
4.【单选题】
void Add(int& a)
{
a++;
}
int a = 250;
Add(a);
说法正确的是:
A 最后 a = 251 B 最后 a = 250 C 程序不能运行
解析:这道题就比较简单了,Add
函数使用了一个引用参数 int& a,
它允许函数直接访问和修改传入的变量的值,所以选A。
5.【单选题】
int main ( int argcount, char* c_ arg[])
{
std::cout << argcount << std::endl;
// 此时屏幕显示2
int a = (int) c_arg[argcount];
a = ?
}
A.0 B.无法确定 C.1
解析:这道题考察main函数参数的知识,这里我有专门的知识详解,具体参考我之前写的文章c++中main(int argc, char* argv[])参数详解,argcount 为 2,说明有 c_ arg数组有两个字符串,一个是运行文件名,另一个不确定,但是要求第三个元素,答案是0。
6.【单选题】
typedef int (*pAdd)(int,int);
pAdd p;
p可以指向下面哪个函数?
A void Add( int a, int b);
B int Add ( int a, int b);
C int Add( float a,f loat b);
解析:这道题用 typedef 定义了一个函数指针。很明显返回值类型和参数都为 int 类型,答案选B。
7.【单选题】
typedef int (*pAdd)(int, int);
int Add(int a, int b)
{
return a + b;
}
std::cout << Add;
屏幕显示50000
pAdd x = (pAdd)0x50000;
int c = x(100,200);
c = ?
A.100 B.200 C.300
解析:这道题答案是C,很简单。但是这道题的来意是弄明白函数的本质是什么,函数的本质就是内存,编译好后就把我们的代码翻译成为了二进制代码,这里 0x50000 就表示函数的首地址,然后通过(pAdd)类型转换为 x 函数。
8.【单选题】
int* Add()
{
int* x = new int [100];
return x;
}
以下说法正确的是:
A 这种写法是错误的,x是一个局部变量指针,返回可能会出错
B 这种写法是正确的
C 这种写法是错误的,应该return &x;
解析:这道题选B。Add 函数返回的是一个指针地址,这里 x 虽然是一个局部变量,但是 new 动态申请的内存地址并不会消失,return x 返回的仅仅是 x 的值,所以这种写法可以。