1.
选择题
存在定义
int a[10], x, *pa;
,
若
pa = &a[0]
,
下列的哪个选项和其他
3
个选项不是等价
的
?
A. x = *pa;
B. x = *(a+1);
C. x = *(pa+1);
D. x = a[1];
答案:A
BC都是将a[1]的值赋予x
D也一样
2.
填空题
请问下列程序的执⾏结果是
_________________
。
void fun(int *p, int n)
{
int i;
for(i = 0; i < n; i++)
(*p)++;
}
int main()
{
int a[5] = {1, 2, 3, 4, 5},i;
fun(a,5);
for(i = 0; i < 5; i++)
printf("%d ", a[i]);
return 0;
}
答案:2.3.4.5.6
(*p)++直接将地址的数字+1
所以在主函数数值是+1后的
3.
选择题
以下哪个选项是
C
语⾔中获取指针所指向的值的正确⽅式?
(
排除法
)
A. *p = p;
B. *p = &p;
C. *p = p->value;
D. *p = p[0];
答案:D
4.
填空题
对于下⾯代码,
*p
是什么?
int a[5] = {2, 3, 4, 5, 6}, *p = &a[2] + 1;
答案:5
5.
选择题
函数调⽤程序如下:
void f(int a[], int n)
{
int i;
for(i=0;i<n;i++)
a[i]=i;
}
int main( )
{
int a[100],n=30;
f(a,n);
...
}
相关说法错误的是:
A.
f
函数头改为
int f(int *a, int n)
,⽆需其它改变,效果完全⼀样。
B.
main
函数中增加
int *p=a;
将
f(a,n);
改为
f(p,n);
,效果完全⼀样。
C.
⽤数组名作
f()
的参数,则
main()
中的数组与
f()
中的数组是同⼀数组。
D.
⽤数组名作
f()
的参数,实现了实参与形参双向的值传递。
答案:D
6.
填空题
以下程序段的输出结果为:
int a[] = {10,9,8,7,6,5,4,3,2,1}, *p;
p = a;
printf("%p,%p,%p,%p,%d,%d\n", a, &a, p, p+9, *p+9, *(p+9) );
答案:10 a[0]的地址 a[0]的地址 a[9]的地址 19 1
7.
编程题
参考学习通上传的
PPT
「第
9
章 指针」,仿照【例
9.6
】实现两个
double
数值的互换,使
⽤「指针
+
函数」。要求:
使⽤两种⽅法
,其中第⼀种⽅式是交换值(
PPT
第
28
⻚)、第
⼆种⽅式是交换指针(
PPT
第
33
⻚)。
#include <stdio.h>
void Swap(int* x, int* y)
{
int temp;
temp = *x;
*x = *y;
*y = temp;
}
int main()
{
int a, b;
a = 5;
b = 9;
Swap(&a, &b);
printf("a=%d,b=%d", a, b);
return 0;
}
#include <stdio.h>
void Swap(int p[])
{
int temp;
temp = p[0];
p[0] = p[1];
p[1] = temp;
}
int main()
{
int a[2] = { 5, 9 };
Swap(a);
printf("%d,%d", a[0], a[1]);
return 0;
}
8.
附加题
C
语⾔
—
作业七
编写程序,输⼊
5
个实数(不⼀定是
int
),使⽤
指针引⽤
的⽅式将它们按从⼤到⼩
的顺序排列。(建议使⽤选择法
/
冒泡法,只要能体现指针引⽤即可,不强制要求所
有代码都要使⽤指针)
输⼊⽰例:
3.2 5.4 6.12 2.51 4.23
(说明:空格隔开)
输出⽰例:
6.12 5.40 4.23 3.20 2.51
(
说明:保留
2
位⼩数
)