1.A
*pa 是指向 a[0] 的指针,而 (a+1) 和 (pa+1) 都表示指向 a[1] 的指针。所以,x = *pa; 和 x = *(pa+1); 是不等价的选项。
2.6 2 3 4 5
函数 fun
中的循环体对数组第一个元素进行了自增操作,所以数组第一个元素的值变成了 6。而在主函数中用循环遍历数组元素时,是从数组下标为 0 的位置开始的,所以第一个元素是 6。
3.C
选项A中的赋值语句将指针p
所指向的内存位置的值设为指针本身的值,显然不正确。
选项B中的赋值语句将指针p
所指向的内存位置的值设为指针本身的地址,也不正确。
选项D中的赋值语句试图将指针p
所指向的第一个元素的值赋给指针本身所指向的内存位置,但是这里没有指定指针所指向的数组,因此也不正确。
只有选项C中的赋值语句,通过使用结构体指针的箭头运算符->
来访问结构体成员value
,并使用解引用运算符*
来获取该成员的值,是正确的获取指针所指向的值的方式。
4.5
指针 p
指向数组 a
的第三个元素 a[2]
的地址,并在此基础上加 1。现在指向了数组 a
的第四个元素 a[3]
的地址。所以*p
的值为 5。
5. D
A.在C语言中,数组名作为函数参数时会被自动转换为指向数组首元素的指针。
B.将 a
的地址赋给一个指针变量 p
,然后将 p
和 n
传递给函数 f()
,也能够实现相同的功能。因为 p
指向数组 a
的首元素,所以在函数调用中,p
和 a
都是指向同一个数组的指针。
C.当我们将数组作为参数传递给函数时,仅传入数组的地址,并不会创建副本。因此,在函数 f()
中,数组 a
和在 main()
函数中定义的数组 a
实际上是同一个数组。
D.
在C语言中,数组名作为函数参数时会被自动转换为指向数组首元素的指针。因此,在函数 f()
中,参数 int a[]
实际上等同于 int *a
,它们都表示传入一个指针。当我们将数组作为参数传递给函数时,仅传入数组的地址,并不会创建副本。因此,对数组元素的修改在原数组中是可见的。尽管形式上看起来是双向的值传递,但实际上修改的是同一个数组,因此只是单向的值传递。
6.000000000062FDF0, 000000000062FDF0, 000000000062FDF0, 000000000062FE14, 19, 1
当我们在输出数组名 a
和它的地址 &a
时,它们的值是相同的,因为数组名本身就是一个指向数组首元素地址的常量指针。因此,a
、&a
和 p
的值都是数组 a
的首地址。
而指针 p + 9
表示将指针 p
向后移动 9 个元素,指向数组 a
的最后一个元素。由于数组 a
一共有 10 个元素,所以 p + 9
指向的元素就是数组 a
的最后一个元素。
接着,*p + 9
表示取指针 p
指向的元素的值,并加上 9,即 10 + 9 = 19
。因为指针 p
指向数组 a
的第一个元素,即 10
,所以 *p
的值为 10
。
最后,*(p + 9)
表示取指针 p + 9
指向的元素的值,即数组 a
的最后一个元素,值为 1
。
7.
(1)交换值
#include <stdio.h>
void swap(double *a, double *b) {
double temp = *a;
*a = *b;
*b = temp;
}
int main() {
double num1 = 2.5;
double num2 = 5.7;
printf("前: num1 = %lf, num2 = %lf\n", num1, num2);
swap(&num1, &num2);
printf("后: num1 = %lf, num2 = %lf\n", num1, num2);
return 0;
}
(2)交换指针
#include <stdio.h>
void swap(double **a, double **b) {
double *temp = *a;
*a = *b;
*b = temp;
}
int main() {
double num1 = 2.5;
double num2 = 5.7;
double *ptr1 = &num1;
double *ptr2 = &num2;
printf("前: num1 = %lf, num2 = %lf\n", *ptr1, *ptr2);
swap(&ptr1, &ptr2);
printf("后: num1 = %lf, num2 = %lf\n", *ptr1, *ptr2);
return 0;
}
8.
#include <stdio.h>
void sort(double *arr, int n) {
for (int i = 0; i < n - 1; i++) {
int max_index = i;
for (int j = i + 1; j < n; j++) {
if (arr[j] > arr[max_index]) {
max_index = j;
}
}
if (max_index != i) {
double temp = arr[i];
arr[i] = arr[max_index];
arr[max_index] = temp;
}
}
}
int main() {
double arr[5];
for (int i = 0; i < 5; i++) {
scanf("%lf", &arr[i]);
}
sort(arr, 5);
for (int i = 0; i < 5; i++) {
printf("%.2lf ", *(arr + i));
}
printf("\n");
return 0;
}