今天做冒泡排序时发现这样一个问题:
下面是冒泡排序流程图
对于含有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值作为参数传进去
顺便再讲讲二维数组的数组名
二维数组的数组名也表示首元素的地址,但要通过二位数组在内存中储存的方式(是线性的)来理解,二维数组的储存方式和一维数组类似都是线性的可以将二维数组看成一维数组里面还有数组,首元素是第一行;
分别计算行和列的大小
有关二位数组的内存储存结构可以去看