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]
首先要明确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: 指针虽然高效、灵活但可能不安全
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);
该题考察的是通过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++)行处设置断点,然后单步运行,直到发现错误原因
依题目已知情况,当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;
-