- 实验目的
掌握指针在数组,函数中的使用
二、实验内容
- 有一个一维数组,存放若干学生的成绩,写一个函数,求平均分,最高分和最低分。
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;
}
- 设计一个静态变量,可以统计某子函数被调用次数。
static int f = 0;
void ef(int* count) {
(*count)++;
printf("函数已被调用 %d 次\n", *count);
}
int main() {
ef(&f);
ef(&f);
ef(&f);
return 0;
}
- 验证指针已学部分课本或讲义例题
- 共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;
}
- 有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;
}
- 用指针实现矩阵转置
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;
}
- 分析前面的实验,将两个以上的实验转为指针方法实现
阶乘:
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释放内存,防止内存泄漏。
指针的类型应该与它所指向的变量的类型相匹配,以确保正确的解引用和操作。