C语言作业七

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,然后将 pn 传递给函数 f(),也能够实现相同的功能。因为 p 指向数组 a 的首元素,所以在函数调用中,pa 都是指向同一个数组的指针。

C.当我们将数组作为参数传递给函数时,仅传入数组的地址,并不会创建副本。因此,在函数 f() 中,数组 a 和在 main() 函数中定义的数组 a 实际上是同一个数组。

D.

在C语言中,数组名作为函数参数时会被自动转换为指向数组首元素的指针。因此,在函数 f() 中,参数 int a[] 实际上等同于 int *a,它们都表示传入一个指针。当我们将数组作为参数传递给函数时,仅传入数组的地址,并不会创建副本。因此,对数组元素的修改在原数组中是可见的。尽管形式上看起来是双向的值传递,但实际上修改的是同一个数组,因此只是单向的值传递。

6.000000000062FDF0, 000000000062FDF0, 000000000062FDF0, 000000000062FE14, 19, 1

当我们在输出数组名 a 和它的地址 &a 时,它们的值是相同的,因为数组名本身就是一个指向数组首元素地址的常量指针。因此,a&ap 的值都是数组 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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值