C++的基礎知識(十一)--數組做函數參數、數組名a與&a區別、數組名a的"數據類型"

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個字節

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章