第一题:
1、有如下代码,则 *(p[0]+1) 所代表的数组元素是( )
int a[3][2] = {1, 2, 3, 4, 5, 6}, *p[3];
p[0] = a[1];
A: a[0][1]
B: a[1][0]
C: a[1][1]
D: a[1][2]
答案及解析:C
首先要明确p是一个指针数组
p[0] = a[1];
此处a[1]是二维数组的第二行的数组名,数组名表示首元素的地址,a[1]是a[1][0]的地址
所以p[0]中存储的是第2行第1个元素的地址,p[0]+1就是第二行第2个元素的地址
*(p[0]+1)就是第二行第二个元素了。
第二题:
2、关于指针下列说法正确的是( )【多选】
A: 任何指针都可以转化为void *
B: void *可以转化为任何指针
C: 指针的大小为8个字节
D: 指针虽然高效、灵活但可能不安全
答案及解析:ABD
A和B:因为指针都是4个/8个字节,指针直接可以任意转换,只是在解引用和对指针做加法的时候有区别。
C:指针占几个字节要看平台,64位环境下8个字节,32位环境下4个字节
D:指针高效但是不安全,因为可能会成为野指针
第三题:
3、以下 scanf 函数调用选项中, 错误的是( )
struct T
{
char name[20];
int age;
int sex;
} a[5], *pa=a;
A: scanf("%s",a[0].name);
B: scanf("%d", &pa[0].age);
C: scanf("%d",&(pa->age));
D: scanf("%d", pa->age);
答案及解析:D
该题考察的是通过scanf函数的调用对结构体数据类型进行初始化。
scanf("输入控制符", 输入参数);
功能:将从键盘输入的字符转化为“输入控制符”所规定格式的数据,然后存入以输入参数的值为地址的变量中
scanf输入时要通过地址找空间
A:name属于字符数组的数组名,相当于数组的首地址,A正确。
B、C用了&是正确的。
D:单独的pa->age可用于输出语句获取值的形式,用在scanf中的时候需要&操作符,D错误
第四题:
4、如下函数 fun 计算 prod=1*2*3*…*n ,并返回计算结果值。但当 n>12 时,返回值不正确。要找出该程序的错误,正确的调试方法是( )
int fun(int n)
{
int prod = 1 , i = 0;
for(i = 1;i <= n;i++)
{
prod *= i;
}
return prod;
}
A: 监视变量prod的值,在prod *= i;行处设置断点,然后单步运行,直到发现错误原因
B: 监视变量prod的值,在return prod;行处设置断点,程序中断后,即可发现错误原因
C: 在prod=1;处设置断点,然后在函数调用堆栈中即可发现错误原因
D: 监视变量i的值,在for (i=1; i<=n; i++)行处设置断点,然后单步运行,直到发现错误原因
答案及解析:B
依题目已知情况,当n<=12时结果是正确的
说明是随着参数的变大计算过程中哪里出了问题
故而要在prod *= i;处设断点,查看原因。
错误原因是数据过大时整型溢出
第五题
5、下列给定程序中,函数 fun 的功能是:把形参a所指数组中的奇数按原顺序依次存放到 a[0]、a[1]、a[2]… 中,把偶数从数组中删除,奇数个数通过函数值返回。
例如,若a所指数组中的数据最初排列为: [9,1,4,2,3,6,5,8,7]
删除偶数后,a所指数组中的数据为: [9,1,3,5,7] ,返回值为5。
请在程序的下画线处填入正确的内容,使程序得出正确的结果( )
int fun(int a[], int n)
{
int i, j;
j=0;
for (i=0; i<n; i++)
{
if (a[i]%2== _________ )
{
a[j]=a[i];
_________;
}
}
return _________;
}
A: 0 j++ j
B: 1 j++ j+1
C: 0 j++ j+1
D: 1 j++ j
答案及解析:D
代码实现的思路应该是arr[i]是奇数的时候要存储起来
所以第一个空是1
最开始j是0,每次找到一个奇数就存储到arr[j]的位置,那接下里j需要+1
所以得第二个空是j++
当循环停止的时候,j其实就是奇数的个数
所以最后返回j,第三个空是j
所以选D。