数组传入函数中要注意

今天做冒泡排序时发现这样一个问题:

下面是冒泡排序流程图

对于含有n个元素的数组,需要进行n-1次(将已经进行的排序次数设为i)排序,而每一次排序需要对照n-1-i组的大小,下面是我今天写代码中所遇到问题的错误代码;

错误代码

#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-i;j++)
		{
			if(arr[j]>arr[j+1])
			{
				int temp=arr[j+1];
				arr[j+1]=arr[j];
				arr[j]=temp;
				
			}
		}
	}
}
int main()
{
	int arr[]={9,8,7,6,5,4,3,2,1,0};
	bubble_sort( arr);
	int i=0;
	int sz=sizeof(arr)/sizeof(arr[0]);
	for(i=0;i<sz;i++)
	{
		printf("%d",arr[i]);
	}
	
	
	return 0;
}

函数中的这一段int sz=sizeof(arr)/sizeof(arr[0]);有问题,sz的值为1;

首先我们应该理解到数组名传参传的是首元素的地址;

数组名是什么?

通过上面错误的代码,我们不禁疑问难道数组名是首元素的地址吗?

况且在主函数里打印arr数组名的地址和arr首元素的地址是一样的;

但是这种情况呢

这时脑子又懵了,下面是解释

其中第三组中&arr+1与&arr之间的差为40,正好为定义的arr数组以字节为单位的大小

除1.2以外所有的数组名都表示数组首元素的地址

所以我们分析下错误原因:

错误原因

在传参时我们使用bubble_sort( arr);所传的arr是数组首元素地址,函数形参中int arr[]是以指针的形式指向arr首元素的地址,所以使用sizeof(arr)/sizeof(arr[0])的值为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-i;j++)
		{
			if(arr[j]>arr[j+1])
			{
				int temp=arr[j+1];
				arr[j+1]=arr[j];
				arr[j]=temp;
				
			}
		}
	}
}
int main()
{
	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]);
	}
	
	
	return 0;
}

需要我们在函数外面就计算好数组的size然后将size值作为参数传进去

顺便再讲讲二维数组的数组名

二维数组的数组名也表示首元素的地址,但要通过二位数组在内存中储存的方式(是线性的)来理解,二维数组的储存方式和一维数组类似都是线性的可以将二维数组看成一维数组里面还有数组,首元素是第一行; 

分别计算行和列的大小

有关二位数组的内存储存结构可以去看

二维数组在内存中的存储结构_二维数组存储结构-CSDN博客

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值