"德信无线是一家公司的名称,这篇资料提及的是该公司多年前的C/C++笔试题目,用于考察应聘者的编程能力。题目涉及到内存管理、指针操作、数组以及函数调用等基础知识。"
以下是这些笔试题目的详解:
1. 题目1:程序输出
```c
main()
{
int a[5] = {1,2,3,4,5};
int* ptr = (int*)(&a+1);
printf("%d%d", *(a+1), *(ptr-1));
}
```
在这个问题中,`&a+1` 指向 `a` 数组之后的一个位置,因为数组名代表其首地址。由于 `int` 是 2 字节,`ptr` 指向的是第 2 个 `int` 的位置,即 `a[1]` 之后。因此,`*(ptr-1)` 将打印 `a[1]` 的值,即 2。`*(a+1)` 直接打印 `a[1]` 的值,也是 2。所以输出是 (b) 21。
2. 题目2:二维数组传递与修改
```c
void foo(int[][3]);
main()
{
int a[3][3]={{1,2,3},{4,5,6},{7,8,9}};
foo(a);
printf("%d", a[2][1]);
}
void foo(int b[][3])
{
++b;
b[1][1] = 9;
}
```
在 `foo` 函数中,`b` 是一个指向数组的指针,`++b` 使指针向后移动一个数组的大小,但这里并未改变实际的数组元素。因此,`b[1][1]` 实际上修改的是原始数组的第二行第二列。所以输出为 (b) 9。
3. 题目3:多维数组与指针
```c
main()
{
int a[][3] = {1,2,3,4,5,6};
int (*ptr)[3] = a;
printf("%d%d", (*ptr)[1], (*ptr)[2]); ++ptr;
printf("%d%d", (*ptr)[1], (*ptr)[2]);
}
```
在这里,`ptr` 是指向数组的指针,它首先指向 `a` 的第一行。第一次输出是 `a[0][1]` 和 `a[0][2]`,即 2 和 3。然后 `ptr` 增加,指向第二行。第二次输出是 `a[1][1]` 和 `a[1][2]`,即 5 和 6。所以答案是 (a) 2356。
4. 题目4:返回局部变量的地址
```c
int *f1(void)
{
int x = 10;
return (&x);
}
int *f2(void)
{
int *ptr;
*ptr = 10;
return ptr;
}
```
这个问题考察了局部变量的生命周期。`f1` 返回了一个局部变量 `x` 的地址,当函数返回时,`x` 不再存在,返回的地址是无效的。而 `f2` 中的 `ptr` 未初始化就赋值,这是未定义行为。两个函数都不安全,不应在实际代码中使用。
这些题目涵盖了C/C++中的基础概念,包括指针操作、数组处理、内存管理以及函数参数传递等。对于C/C++初学者来说,这些都是很重要的知识点。理解这些问题的答案有助于深入理解这两种语言的内存模型和指针的工作原理。