C语言--每日五道选择题--Day2

第一题:

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

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。

你可能感兴趣的:(C语言选择题,c语言,开发语言)