数组排序及数组做函数参数将会退化为指针
- 数组排序
1.选择排序思想 |
2.选择排序初级代码
#include<stdio.h> #include<stdlib.h>
int main() { int a[10] = {10, 512, 213, 123, 11, 231, 283, 45, 254, 354};
int k = 0; int j = 0, i = 0, temp = 0;
printf("排序前\n"); //排序前打印输出 for (k = 0; k <10; k++) { printf(" %d", a[k]); } printf("\n");
for(i = 0; i <10; i++) //外层循环控制行循环 { for(j = 1+i; j <10; j++ ) //内层循环控制行内循环 { if (a[i] < a[j]) { temp = a[i]; a[i] = a[j]; a[j] = temp;
} } } printf("排序后\n");//排序前打印输出 for (k = 0; k <10; k++) { printf(" %d", a[k]); } printf("\n"); system("pause"); } |
- 优化打印代码,每次打印一个数组都需要写一个for循环这样太麻烦了,可以优化一下
定义一个打印函数 优化1:正确的void arrayout(int *a) //第一步优化 { int k = 0; for (k = 0; k <10; k++) { printf(" %d", a[k]); } printf("\n"); } 结论:虽然把数组打印封装成了函数但是代码中的k <10,指定了数组的大小为10,实际应用中数组元素可能不为10 优化2:正确的void arrayout(int *a,int num) //第二步优化 { int k = 0; for (k = 0; k <num; k++) { printf(" %d", a[k]); } printf("\n"); } 结论:在函数参数里传入一个数组大小的变量,这样函数参数又变多了,还可以再进一步优化 优化3:错误的//1.数组做函数参数会退化为指针 //2.虽然在函数参数中定义了一个数组,但是编译器还是把它当做指针不会给他分配内存 //即在形参里面出现char buf[30] 或者 int a[20] c/c++编译器会把它当做一个指针也不会主动的多分配内存 //函数参数中定义的数组数据类型为int 占四个字节 void arrayout1(int a[10]) //第三步错误的优化 { int k = 0; int mm = sizeof(a[10]); int num = sizeof(a[10])/ sizeof(*a);
for (k = 0; k <num; k++) { printf(" %d", a[k]); } printf("\n"); }
结论:1.数组做函数参数时会退化为指针 2.数组做函数参数后再用sizeof求数组的大小,这时大小便为int类型 实质是数组类型不一致
|