1024复习题3-代码细节

53 阅读1分钟

对于冒泡排序的存储有以下问题:

#include <stdio.h>
#define ARRAY_SIZE(arr) (sizeof(arr)/sizeof((arr)[0]))   //添加这样一句话使用宏定义数组大小
void sort(  float a[],int n  )
{
   int i,j;
   float t;
   for(i=0; i<n-1;i++)
   { 
      for(j=0;  j<n-i-1 ;j++) 
           if(a[j]>a[j+1])   { t=a[j];  a[j]=a[j+1]     ; a[j+1]=t; }
   }
}
int main()
{
    float a[7]={2,6,3,8,3,12,9}; 
    int i;
	int n=ARRAY_SIZE(a);
    sort(a,n);
    for(i=0;i<7;i++)
		printf("%.0f ",a[i]); 
	printf("\n");
   return 0;
}

如果使用学生的方法:在函数内部使用,实参传递的时候,数组作为参数传递给函数时,它会退化成指针。因此sizeof(a) 实际上返回的是指针的大小(通常是4或8字节),而不是整个数组的大小。所以这样会导致n的值不正确,无法执行排序。

以上代码中,仅适用于数组在同一作用域内的情况,即数组未被作为指针传递到函数中。

补充建议:

1.避免在函数内部计算数组大小:数组作为参数传递会退化成指针,无法在函数内部正确计算数组大小。因此,始终建议将数组大小作为额外的参数传递给函数。