C语言数组(7)--- 数组作为函数参数
  uUWKQE7Avyk4 2023年11月02日 20 0

一.导入

在我们写代码的时候,很多时候都会将数组作为参数传入函数,例如我们需要实现冒泡排序,我们假设有一个整型数组arr里面的内容是 9 8 7 6 5 4 3 2 1 0,我们需要用到冒泡排序算法将其变成 0 1 2 4 5 6 7 8 9 

思路:我们写一个函数 bubble_sort(),将数组arr作为参数传入函数,在C语言中数组传参有两种写法:

第一种:直接传入数组

第二种:传入指针

相比起第二种方式传入指针,第一种写法更加容易理解,以下是代码:

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
void bubble_sort(int arr[]){
//函数实现
}
int main(void)
{
	int arr[] = {9,8,7,6,5,4,3,2,1,0};
	bubble_sort(arr);
	return 0;
}

上述代码中函数bubble_sort()的形参是一个整型数组,我们将main()函数中的arr数组传入该函数即可

接下来就是本程序的核心---冒泡排序

我们可以将冒泡排序理解为下图中的内容:

C语言数组(7)--- 数组作为函数参数_函数

我们可以看到图中一趟冒泡排序是让一个数组来到它最终一个出现的位置上,我们也可以根据这一特点得出一下结论:

若有n个元素,则冒泡排序的趟数为:n-1 趟

那么我们可以写出以下代码:

C语言数组(7)--- 数组作为函数参数_指针_02

我们首先使用sizeof()函数计算出数组元素的总个数,然后创建一个for循环当变量i的值小于sz-1的时候进入循环,执行一趟冒泡排序

我们假定第一个元素的下标为:j,则第二个下标则为:j+1,如图所示:

C语言数组(7)--- 数组作为函数参数_地址_03

我们再来想一想,当我们一趟冒泡排序完成后,是不是我们冒泡排序的次数就可以减1,此时只需要对

8 7 6 5 4 3 2 1 0 来进行冒泡排序,这样每趟都减1,所以我们就可以将代码写成如下形式:

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
void bubble_sort(int arr[]){
	int sz = sizeof(arr) / sizeof(arr[0]);
	int i = 0;
	for (i = 0; i < sz - 1; i++){
		int j = 0;
		for (j = 0; j < sz-1; j++){
			if (arr[j] > arr[j + 1]){
				//交换
			}
		}
	}
}
int main(void){
	int arr[] = {9,8,7,6,5,4,3,2,1,0};
	bubble_sort(arr);
	return 0;
}

接下来我们就需要实现交换功能,我们之前实现交换功能的时候都会创建一个tmp变量,这里也可以使用这种方法,代码如下:

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
void bubble_sort(int arr[]){
	int sz = sizeof(arr) / sizeof(arr[0]);
	int i = 0;
	for (i = 0; i < sz - 1; i++){
		int j = 0;
		for (j = 0; j < sz-1; j++){
			if (arr[j] > arr[j + 1]){
				int tmp = arr[j];
				arr[j] = arr[j+1];
				arr[j + 1] = tmp;
			}
		}
	}
}
int main(void){
	int arr[] = {9,8,7,6,5,4,3,2,1,0};
	bubble_sort(arr);
	return 0;
}

这样就实现了交换功能,最后一步就是在main()函数中进行输出

main()函数部分代码:

int main(void){
	int arr[] = {9,8,7,6,5,4,3,2,1,0};
	bubble_sort(arr);
	int sz = sizeof(arr) / sizeof(arr[0]);
	int i = 0;
	for (i = 0; i < sz; i++){
		printf("%d ",arr[i]);
	}
	getchar();
	return 0;
}

但是当我们运行程序以后发现,程序并没有按照我们的设想进行排序

这时候我们就需要对程序进行调试,按下F10进入程序的调试,我们发现了几个问题:

问题1:我们明明传入的是一个数组,为什么在监视窗口只显示了一个元素

问题2:在bubble_sort()函数中sz的值理应是10,但是在程序运行时却变成了1

如图所示:

C语言数组(7)--- 数组作为函数参数_地址_04

当sz的值为1的时候,在for循环中1-1=0,条件则变成了 i<0 进入循环不符合条件,for循环中的内容也不会被执行,我们之前说过数组传参的本质就是将数组首元素的地址传入函数,并不是将数组传入函数

所以这里arr看似是数组其实是指针,所以sizeof()计算应该是 4/4=1 (32位平台)那既然我们不能在函数中直接算出元素个数,那我们就在main()函数中将元素的个数计算出来,然后传入bubble_sort()函数中

最后代码可以写成如下形式:

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
void bubble_sort(int arr[],int sz){
	int i = 0;
	for (i = 0; i < sz - 1; i++){
		int j = 0;
		for (j = 0; j < sz-1; j++){
			if (arr[j] > arr[j + 1]){
				int tmp = arr[j];
				arr[j] = arr[j+1];
				arr[j + 1] = tmp;
			}
		}
	}
}
int main(void){
	int arr[] = {9,8,7,6,5,4,3,2,1,0};
	int sz = sizeof(arr) / sizeof(arr[0]);
	bubble_sort(arr, sz);
	int i = 0;
	for (i = 0; i < sz; i++){
		printf("%d ",arr[i]);
	}
	getchar();
	return 0;
}

我们再次运行程序就可以发现,这次程序成功进行了排序,如图所示:

C语言数组(7)--- 数组作为函数参数_冒泡排序_05

                                                                                                   2023/8/30

                                                                                                      王起舟

【版权声明】本文内容来自摩杜云社区用户原创、第三方投稿、转载,内容版权归原作者所有。本网站的目的在于传递更多信息,不拥有版权,亦不承担相应法律责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@moduyun.com

  1. 分享:
最后一次编辑于 2023年11月08日 0

暂无评论

推荐阅读
  zLxnEsMLk4BL   2023年11月19日   31   0   0 数组字符串数组名
  gBkHYLY8jvYd   2023年11月19日   27   0   0 #include数组ci
  X5zJxoD00Cah   2023年11月19日   21   0   0 数组单引号字符串
  gBkHYLY8jvYd   2023年12月10日   23   0   0 #include数组i++
uUWKQE7Avyk4