lizhuolin
1.
选择题
存在定义
int a[10], x, *pa;
,
若
pa = &a[0]
,
下列的哪个选项和其他
3
个选项不是等价
的
? (A)
A. x = *pa;
B. x = *(a+1);
C. x = *(pa+1);
D. x = a[1]
2.
填空题
请问下列程序的执⾏结果是 __2 3 4 5 6
_。
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;
}
3.
选择题
以下哪个选项是
C
语⾔中获取指针所指向的值的正确⽅式?
(
排除法
)
A. *p = p;
B. *p = &p;
C. *p = p->value;
D. *p = p[0];
答案:D
解释:*p = p; 这个选项将指针
p
的值赋给了
*p
,而不是获取指针所指向的值。*p = &p; 这个选项将指针
p
的地址赋给了
*p
,而不是获取指针所指向的值。*p = p->value; 这个选项使用了箭头操作符
->
,它是用来访问结构体指针所指向的结构体中的成员。在这个选项中,
p
被视为一个指向结构体的指针,而不是一个普通指针。
4.
填空题
对于下⾯代码,
*p
是什么?
int a[5] = {2, 3, 4, 5, 6}, *p = &a[2] + 1;
答案:*p是指针p指向的值,即数组
a
的第四个元素
a[3]
的值。在给定的代码中,
*p
的值为 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
解释:在 C 语言中,数组名作为函数参数只实现了单向的值传递,即将数组的地址传递给函数,而不是实现双向的值传递。函数内部对数组的修改会影响到原始数组,但函数外部对数组的修改不会反映到函数内部。
6.
填空题
以下程序段的输出结果为:不知道,不知道,不知道,不知道,19,1
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) );
解释:不知道的值为a[]的首地址,由于编译器或者存储的不同,首地址可能会不同,但是基于我自己电脑输出的结果可以很容易得出输出结果为:(仅供参考)
0x7ffd1e0b5a00, 0x7ffd1e0b5a00, 0x7ffd1e0b5a00, 0x7ffd1e0b5a24, 19, 1
7.
编程题
参考学习通上传的
PPT
「第
9
章 指针」,仿照【例
9.6
】实现两个
double
数值的互换,使
⽤「指针
+
函数」。要求:
使⽤两种⽅法
,其中第⼀种⽅式是交换值(
PPT
第
28
⻚)、第
⼆种⽅式是交换指针(
PPT
第
33
⻚)。
//
代码
1
:交换值的⽅法如下
....
#include<stdio.h>
int main()
{
double a, b;
a = 5.0;
b = 9.0;
Swap( &a, &b );
printf("a=%lf,b=%lf",a,b);
return 0;
}
void Swap( double *x, double *y )
{
double temp;
temp = *x;
*x = *y;
*y = temp;
}
//
代码
2
:交换指针的⽅法如下
....
#include<stdio.h>
int main()
{
double a, b;
a = 5.0;
b = 9.0;
double *ptr1 = &a;
double *ptr2 = &b;
Swap( &ptr1, &ptr2 );
printf("a=%lf,b=%lf",a,b);
return 0;
}
void Swap(double **x, double **y)
{
double *pTemp = *x;
*x = *y;
*y = pTemp;
}
8.
附加题
编写程序,输⼊
5
个实数(不⼀定是
int
),使⽤
指针引⽤
的⽅式将它们按从⼤到⼩
的顺序排列。(建议使⽤选择法
/
冒泡法,只要能体现指针引⽤即可,不强制要求所
有代码都要使⽤指针)
输⼊⽰例:
3.2 5.4 6.12 2.51 4.23
(说明:空格隔开)
输出⽰例:
6.12 5.40 4.23 3.20 2.51
(
说明:保留
2
位⼩数
)
//
代码如下
....
#include <stdio.h>
void swap(double *a, double *b) {
double temp = *a;
*a = *b;
*b = temp;
}
void sortArray(double *arr, int size) {
for (int i = 0; i < size - 1; i++) {
for (int j = 0; j < size - i - 1; j++) {
if (*(arr + j) < *(arr + j + 1)) {
swap(arr + j, arr + j + 1);
}
}
}
}
int main() {
double arr[5];
printf("Enter 5 real numbers separated by spaces: ");
scanf("%lf %lf %lf %lf %lf", &arr[0], &arr[1], &arr[2], &arr[3], &arr[4]);
sortArray(arr, 5);
printf("Sorted array in descending order:\n");
for (int i = 0; i < 5; i++) {
printf("%.2lf ", arr[i]);
}
printf("\n");
return 0;
}