1. ## 总结
  2. ==为什么num2会是1==
  3. - 结论1:正确的做法应是把数组的内存首地址和数组的有效长度传给被调用函数
  4. - 结论2:为什么是1 实参的a(数组)和形参a(指针) 的数据类型本质不一样
  5. - 既使形参传递数组a arraySort2(int a[], int num)编译器会把它当成指针处理 这是C语言的特色
  6. - 本质剖析3
  7. 形参(int *a)写在函数上和写在函数内是一样的,只不过写在函数上是具有对外的属性而已

include

include

int main2() { int i = 0, j = 0; int a[10] = { 3, 1, 44, 2, 3, 44, 5, 5,6, 67 }; int tmp = 0;

  1. for (i = 0; i < 10; i++) {//外层循环 行
  2. for (j = i + 1; j < 10; j++) { // 内层循环
  3. if (a[i] > a[j]) { //如果小就交互换位置
  4. tmp = a[i];
  5. a[i] = a[j];
  6. a[j] = tmp;
  7. }
  8. }
  9. }
  10. for (i = 0; i < 10; i++) {
  11. printf("%d ,", a[i]);
  12. }
  13. system("pause");
  14. return 0;

}

int arraySort(int a[], int num) { int i = 0, j = 0; int tmp = 0;

  1. for (i = 0; i < num; i++) {//外层循环 行
  2. for (j = i + 1; j < num; j++) { // 内层循环
  3. if (a[i] > a[j]) { //如果小就交互换位置
  4. tmp = a[i];
  5. a[i] = a[j];
  6. a[j] = tmp;
  7. }
  8. }
  9. }
  10. for (i = 0; i < 10; i++) {
  11. printf("%d ,", a[i]);
  12. }
  13. return 0;

}

int arraySort2(int a, int num) { // int a; //写在函数上和写在函数内是一样的,只不过写在函数上是具有对外的属性而已

  1. int i = 0, j = 0;
  2. int tmp = 0;
  3. int num2 = 0;
  4. num2 = sizeof(a) / sizeof(*a);
  5. printf("%d,%d,%d\n", sizeof(a), sizeof(*a), num2);//4 4 1
  6. /*
  7. 为什么num2会是1
  8. 数组做函数参数的退回问题 退回为一个指针
  9. 结论1:正确的做法应是把数组的内存首地址和数组的有效长度传给被调用函数
  10. 结论2: 为什么是1 实参的a(数组)和形参a(指针) 的数据类型本质不一样
  11. 既使形参传递数组a arraySort2(int a[], int num)编译器会把它当成指针处理 这是C语言的特色
  12. 本质剖析3:
  13. 形参(int *a)写在函数上和写在函数内是一样的,只不过写在函数上是具有对外的属性而已
  14. */
  15. for (i = 0; i < num; i++) {
  16. for (j = i + 1; j < num; j++) {
  17. if (a[i] > a[j]) {
  18. tmp = a[i];
  19. a[i] = a[j];
  20. a[j] = tmp;
  21. }
  22. }
  23. }
  24. for (i = 0; i < 10; i++) {
  25. printf("%d ,", a[i]);
  26. }
  27. return 0;

}

int main() { int a[10] = { 3, 1, 44, 2, 3, 44, 5, 5,6, 67 };

  1. int num = 0;
  2. num = sizeof(a) / sizeof(a[0]);
  3. printf("num=%d\ta=%d\ta[0]=%d\n", num, sizeof(a), sizeof(a[0])); //num=10 a=40 a[0]=4
  4. //arraySort(a, num);
  5. arraySort2(a, num);
  6. printf("\n");
  7. for (int i = 0; i < 10; i++) {
  8. printf("%d ,", a[i]);
  9. }
  10. system("pause");
  11. return 0;

}

总结

为什么num2会是1

  • 结论1:正确的做法应是把数组的内存首地址和数组的有效长度传给被调用函数
  • 结论2:为什么是1 实参的a(数组)和形参a(指针) 的数据类型本质不一样 ;
  • 既使形参传递数组a arraySort2(int a[], int num)编译器会把它当成指针处理 这是C语言的特色
  • 本质剖析3:
    形参(int *a)写在函数上和写在函数内是一样的,只不过写在函数上是具有对外的属性而已