目录
一、数组作为函数参数
数组也可以作为参数传给函数。
冒泡排序
冒泡排序函数将一个整形数组排序。升序
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()
{
int arr[] = { 9,8,7,6,5,4,3,2,1,0 };//改成升序
int i = 0;
int sz = sizeof(arr) / sizeof(arr[0]);
bubble_sort(arr, sz);
for (i = 0; i < sz; i++)
{
printf("%d ", arr[i]);
}
return 0;
如果sz是在函数里面定义的,那么结果不变,还是原先的排序。如果监视整个程序,发现bubble函数里sz值为1。这就是之前的数组传参问题,只传首元素地址。下面有一个十个元素的arr数组,void bubble_sort(int arr[]),上面的arr也有10个,这样就造成了浪费,所以程序自动只传第一个地址。所以没进入函数前就算好后,再带入sz的值就可以:bubble_sort(arr, sz); 那么接受时,void bubble_sort(int arr[], int sz)。
但是这个程序效率可以看到比较低,而且有限制。如果本身给了一个升序的数组,那么程序还是一样,按照步骤做,结果也确实是升序,但是程序效率太低。假如给的元素多,程序负担更重。做一些改动,在声明 j 之前:int flag = 1; //先假设这一趟要排序的数据已经有序,然后按照程序走,交换数值,那么数组不再有序,再arr[j + 1] = tmp后写上flag = 0,其意思为本趟排序的数据其实不完全有序.当程序运行后,发现不需要交换,那么flag是1,如果交换了,那就变为0,再:
void bubble_sort(int arr[], int sz)
{
int i = 0;
for (i = 0; i < sz - 1; i++)
{
int flag = 1;
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;
flag = 0;
}
}
if (flag == 1)
break;
}
}
这样就正常了。break只能用于for和switch语句。if不是循环,用break不能结束。
二、数组名
int arr[] = { 1,2,3,4,5,6,7 };
printf("%p\n", arr);
printf("%p\n", &arr[0]);
printf("%p\n", *arr);
输出的结果相同,都输出首元素的地址,arr都代表首元素地址。数组名是数组首元素的地址,(有两个例外):
1、sizeof(数组名),单独放一个数组名时,此时表示整个数组。
2、&数组名,这时数组名代表整个数组的地址。
printf("%p\n", &arr)
printf("%p\n", &arr[0])
结果一样,但是第一个并不是出来了首元素地址。&arr只是显示出了开始的位置,数组从这开始。假如printf("%p\n", &arr + 1)
printf("%p\n", &arr[0] + 1)第二个打印出第二个元素的地址,而第一个会打印出第28个。因为数组有7个元素,每个占4个字节。
可以把%p换成%d再来看。
结束。