c指针练习

80 阅读3分钟

(1)请编写一个C语言程序,要求如下:

  1. main 函数中定义一个整型数组 int arr[] = {3, 7, 2, 9, 5};

  2. 定义一个名为 findStats 的函数,接收以下参数:

    • 整型指针(指向数组首元素)
    • 数组长度(int 类型)
    • 两个指针参数,用于返回数组的平均值(double)最大值(int)
  3. main 中调用 findStats 后,打印平均值和最大值。

(2)附加要求:

  • 必须通过指针算术(如 ptr++)遍历数组,禁止使用下标语法(如 arr[i])。

  • 若数组为空(长度为0),函数内直接返回不修改结果。

  • 平均值保留两位小数。

(3)题解

```
#include<stdio.h>
void findStats(int*arr,int len,int *max,double *avg ){
    //把max指向的地址的值赋值为arr指向的地址的值
    * max = *arr;
    //定义一个求和的变量
    int sum = 0;
    //数组长度如果为0的话就结束循环
    if (len == 0) {
        return;
    }
    //遍历数组
    for (int i = 0;i < len;i++) {
        
        if (*max < * arr) {
            * max= *arr;
        }
        sum += *arr;
        arr++;
​
    }
    *avg = ((double)sum / len);
​
}
int main() {
    //求最大值和平均值
    int arr[] = { 3,7,2,9,5 };
    //求出数组长度
    int len = sizeof(arr) / sizeof(arr[0]);
    //定义最大值
    int max;
    //定义平均值
    double avg;
    findStats( arr,len,&max,&avg);
    printf("%.2f\n", avg);
    printf("%d", max);
}
//这个题是我让deepseek帮我出的一道练习题,针对指针和数组方面的.
```

(4)函数思路

1.1题目要求要在函数里对一个数组进行求最大值和平均值,且不能用下标语法,所以传入数组的地址也就是*arr,

1.2题目要求要返回返回平均值和最大值,但是函数通常来说只能返回一个值,所以返回平均值和最大值就得通过指针的方式来进行返回,也就是函数形参里的*max, *avg.

2.1用下标语法求最大值时,会先定义一个最大值的变量,一般来说初始值为数组第一项这里用法相似*max = *arr;意思是把max指向的地址的值赋值为arr指向的地址的值.

2.2这里的*arr表示的是数组的第一项 (arr指向的值默认为数组第一项)

3.1现在应该遍历数组求最大值也就是for循环每一个元素,用if让数组每一项跟max作对比,如果值比max大则当前值赋值给max,在本题中也就是if (*max < * arr) ;当然数组要遍历每一个数那就应该是arr++;,正常来讲++就是加1,但在这里arr是一个地址,所以它每次++都是加上定义arr的类型的占得字符,就比如题中用int定义的arr所以每次arr++;都是再加4个字符.

3.2另外要返回的值是平均值,平均值的公式是总数/元素个数,所以在数组遍历的同时,也应该将它们相加.所以应该先定义一个空值为了存相加的值,也就是int sum = 0;.之后应该将每个遍历的数值相加也就是 sum += *arr;.当然这个必须要放在arr++;之前,要不然就会漏掉一个数.

3.3遍历数组写好了,但有可能会出现传入一个空数组,所以需要再进for循环之前要先判断一下数组中元素是否为0,也就是if (len == 0).

4.1这些都写好以后还差最后一个平均值,在前面已经把所有元素的和求出来了sum,就需要把和/个数的只算出来,但在这之前,无法保证和/个数一定是个整数,所以要进行强制转换也就是(double)sum,这样就可以把平均值的值赋给存平均值地址的变量也就是*avg = ((double)sum / len);.

(5)总结

(1)(2)为deepseek出的题目.第一次做分析,如果有纰漏或错误请指出来,我一定会耐心学习.吐槽一下deepseek识图功能还是有些欠缺.