C语言指针在数组,函数中的使用

  • 实验目的

掌握指针在数组,函数中的使用

二、实验内容

  1. 有一个一维数组,存放若干学生的成绩,写一个函数,求平均分,最高分和最低分。

 void hanshu(int* grades, int n, float* average, int* max, int* min) {

    int i,sum = 0;

    *max = *min = grades[0];

    for ( i = 0; i < n; i++) {

        sum = sum+grades[i];

        if (grades[i] > *max) {

            *max = grades[i];

        }

        if (grades[i] < *min) {

            *min = grades[i];

        }

    }

    *average = sum / n;

}

int main() {

    int i,n;

    printf("输入学生数量: ");

    scanf("%d", &n);

    int grades[n];

    printf("输入学生成绩:\n");

    for (i = 0; i <n; i++) {

        printf("学生 %d 成绩: ", i + 1);

        scanf("%d", &grades[i]);

    }

    float average;

    int max, min;

   hanshu(grades, n, &average, &max, &min);

    printf("平均分: %.2f\n",average);

    printf("最高分: %d\n",max);

    printf("最低分: %d\n",min);

    return 0;


}

  1. 设计一个静态变量,可以统计某子函数被调用次数。

static int f = 0;

void ef(int* count) {

    (*count)++;

    printf("函数已被调用 %d 次\n", *count);

}

int main() {

    ef(&f);

    ef(&f);

    ef(&f);

    return 0;

}

  1. 验证指针已学部分课本或讲义例题

  1. 共L=M+N个数,用指针操作将M和N个数交换顺序

void swap(int* array1, int* array2, int M, int N) {

    int i = 0;

       if (M != N) {

        printf("Error: 数组长度不相同\n");

        return;

    }

    for (i = 0; i < M; i++) {

        int temp = *(array1 + i);

        *(array1 + i) = *(array2 + i);

        *(array2 + i) = temp;

    }

}

int main() {

    int M,i,N;

    printf("输入数组1的长度 M: ");

    scanf("%d", &M);

    printf("输入数组2的长度 N: ");

    scanf("%d", &N);

    int array1[M];

    int array2[N];

    printf("输入数组1的元素:\n");

    for (i = 0; i < M; i++) {

        printf("元素 %d: ", i + 1);

        scanf("%d", &array1[i]);

    }

    printf("输入数组2的元素:\n");

    for (i = 0; i < N; i++) {

        printf("元素 %d: ", i + 1);

        scanf("%d", &array2[i]);

    }

    swap(array1, array2, M, N);

    printf("交换后的数组1:\n");

    for (i = 0; i < M; i++) {

        printf("%d ", array1[i]);

    }

    printf("\n交换后的数组2:\n");

    for (i = 0; i < N; i++) {

        printf("%d ", array2[i]);

    }

    return 0;

}

  1. 有n个人围成一圈,顺序排号。从第1个人开始报数(从1到3报数),凡报到3的人退出圈子,问最后留下的是原来第几号的那位。(习题10.5)

int main()

{int i,k,m,n,num[50],*p;

printf("\n n=") ;

scanf("%d",&n);

p=num;

for(i=0;i<n;i++)

*(p+i)=i+1;

i=0;

k=0;

m=0;

while(m<n-1)

{if(*(p+i)!=0)

k++;

if(k==3)

{*(p+i)=0;

k=0;

m++;

}

i++;

if(i==n)

i=0;

}

while(*p==0)

p++;

printf("the last one is No.%d",*p);

return 0;

}

  1. 用指针实现矩阵转置

void t(int rows, int cols, int matrix[rows][cols]) {

    int result[cols][rows];

    int i,j= 0;

    for (i = 0; i < rows; i++) {

        for (j = 0; j < cols; j++) {

            result[j][i] = matrix[i][j];

        }

    }

    for (i = 0; i < cols; i++) {

        for (j = 0; j < rows; j++) {

            matrix[i][j] = result[i][j];

        }

    }

}

void p(int rows, int cols, int matrix[rows][cols]) {

       int i,j = 0;

    for ( i = 0; i < rows; i++) {

        for (j = 0; j < cols; j++) {

            printf("%d\t", matrix[i][j]);

        }

        printf("\n");

    }

}

int main() {

    int rows, cols,i,j;

   

    printf("输入矩阵的行数: ");

    scanf("%d", &rows);

    printf("输入矩阵的列数: ");

    scanf("%d", &cols);

    int matrix[rows][cols];

    printf("输入矩阵元素:\n");

    for (i = 0; i < rows; i++) {

        for (j = 0; j < cols; j++) {

            printf("元素 (%d, %d): ", i + 1, j + 1);

            scanf("%d", &matrix[i][j]);

        }

    }

    printf("原始矩阵:\n");

    p(rows, cols, matrix);

    t(rows, cols, matrix);

    printf("转置后的矩阵:\n");

    p(cols, rows, matrix);

    return 0;

}

  1. 分析前面的实验,将两个以上的实验转为指针方法实现

阶乘:

int main() {

    int n;

    printf("输入一个整数: ");

    scanf("%d", &n);

    int result;

    a(n, &result);

    printf("%d 的阶乘是: %d\n", n, result);

    return 0;

}

void a(int n, int *result) {

    int i = 0;

    *result = 1;

    for (i = 1; i <= n; i++) {

        *result *= i;

    }


}

判断是否为闰年

void c(int year, char *result);

int main() {

    int year;

    printf("请输入一个年份: ");

    scanf("%d", &year);

    char result[10]; 

    c(year, result);

    printf("%d年是%s\n", year, result);

    return 0;

}

void c(int year, char *result) {

    if (year % 4 == 0) {

        if (year % 100 == 0 && year % 400 != 0) {

            sprintf(result, "不是闰年");

        } else {

            sprintf(result, "闰年");

        }

    } else {

        sprintf(result, "不是闰年");

    }


}

输入十个数,输出最大的数,并输出他在原数组中的第几个数

void a1(int arr[], int size, int *max, int *index) {

    int i = 1;

    *max = arr[0];

    *index = 0;

    for (i = 1; i < size; i++) {

        if (arr[i] > *max) {

            *max = arr[i];

            *index = i;

        }

    }

}

int main() {

    int numbers[10];

    int i = 0;

    printf("输入十个数:\n");

    for (i = 0; i < 10; i++) {

        scanf("%d", &numbers[i]);

    }

    int max, index;

   a1(numbers, 10, &max, &index);

    printf("最大的数是: %d\n", max);

    printf("它在原数组中的位置是第 %d 个数\n", index + 1); 

    return 0;


}

三、实验总结

指针在使用前应该被正确地初始化,否则它可能包含随机的内存地址值。

当使用指针进行算术运算时,确保不越界。指针算术的结果应该在数组的有效范围内。

当将指针作为参数传递给函数时,确保函数内部对指针进行有效性检查,并避免在函数内部修改传入的指针所指向的内存。

在使用动态内存分配函数(如malloc、calloc等)分配内存时,确保在使用完毕后使用free释放内存,防止内存泄漏。

指针的类型应该与它所指向的变量的类型相匹配,以确保正确的解引用和操作。

  • 19
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值