1、數組作爲函數參數
C語言中,數組做爲函數的參數,退化爲指針。數組作爲參數傳給函數時,傳的是指針而不是數組,傳遞的是數組的首元素的地址。
一般來說函數參數如果爲數組,可以有兩個參數,一個是數組名,一個是數組長度,對於排序而言,一般是要知道給定數組的首元素的地址,即需要排序的數組在內存中的起始地址,同時還需給定待排序的數據個數。void sortArray ( int a[ ] , int num ) 以及void sortArray (int a[100] ,int num ) 都可以用void sortArray (int *a ,int num ) 表示。
//冒泡排序
void sortArray(int *a ,int num )
{
int i ,j ,temp;
for(i =0 ;i <num;i++)//外層每次選定出需要排序的一個元素,依次向後
{
for( j=i+1; j<num; j++ )//內層:外層選定的一個元素與其後所有元素依次比較,找出最小的元素
{
if(a[i]>a[j]) //交換類代碼
{
temp = a[i];
a[i]=a[j];
a[j]=temp;
}
}
}
}
2、參數傳遞
如果a是一個數組
int num =0 ; //在32機器中告訴C編譯器分配4個字節的內存
int a [] = {1,3,5,12,6,7,54,32}; //告訴C編譯器分配32個字節的內存
// num = sizeof(a)/sizeof(int);
num = sizeof(a)/sizeof(a[0]);
printf("排序之前:");
printArray(a,num);
sortArray(a,num);
printf("排序之後:");
printArray(a,num);
如果a是一個單一整形變量的地址
int test =5;
int *p = &test;
int num1 = 0;
num1 = sizeof(p)/sizeof(p[0]);
sortArray(p,num1);
printf("排序之後:");
printArray(p,num1);
對同一個對象有兩種不同的符號表示,如定義:a[n]時等價於(a+n),即尋址到內存的a,然後移動n個單元,再取出數組。故p[0]等價於(p+0),該值的類型爲int型。
num1=sizeof(p)/sizeof(p[0]) 等價於 num1=sizeof(p)/sizeof(int );
3、聲明數組參量
/** 函數原型聲明4中等價形式
int sum (int *a , int n)
int sum (int * , int )
int sum (int a[] , int n)
int sum (int [] , int ) //可能略微不熟悉的一種
*/
定義函數
/** 等價形式
int sum (int *a , int n)
{}
int sum (int a[] , int n)
{}
*/
4、a與&a的區別
int num =0 ; //在32機器中告訴C編譯器分配4個字節的內存
int a [] = {1,3,5,12,6,7,54,32}; //告訴C編譯器分配32個字節的內存
printf("a:%d ,a+1:%d,&a:%d,&a+1:%d\n",a,a+1,&a,&a+1) ;
//a+1 和 &a+1 結果不一樣
//雖然輸出結果上面,a和&a一樣 。 但是a 和 &a所代表的數據類型不一樣
/*重要*/
//a 代表的數據首元素的地址 (首元素),同時與整個數組地址重合,但其不能代表整個數組,只能代表起始個體的地址
//&a代表的是整個數組的地址 (特別特別的注意) 它的加1是以整塊數組所佔字節數總數爲單位1
輸出結果:a:1638176 ,a+1:1638180,&a:1638176,&a+1:1638208
5、指針所佔字節數
在64位機器中,int*的指針爲8個字節,在32位中int*爲 4個字節