一維數組做函數的輸入

數組做輸入,退化爲指針
以一個簡單的程序爲例,如給數組排序

void print_array(int *arr, int len);
void sort_array(int *a, int n);
int main(void)
{
    //建立一個無序的數組
    int a[] = { 10,11,2,3,5,88,4,6,4,32,12 };
    //獲取元素個數
    int n = sizeof(a) / sizeof(a[0]);
    
    printf("排序前\n");
    //首先進行一次輸出,數組、長度作爲輸入參數
    print_array(a, n);
    //給數組排序
    sort_array(a, n);
    printf("排序後\n");
    //再次輸出數組的元素
    print_array(a, n);
    
    printf("\n");
    system("pause");
    return 0;
}
void print_array(int *arr, int len)
{    
    int n = sizeof(arr) / sizeof(arr[0]);//元素個數
    printf("指針型數組長度%d\n",n);
    int i = 0;
    for ( i = 0; i < len; i++)
    {
        printf("%d ",arr[i]);
    }
    printf("\n");
}

void sort_array(int *a, int n)
{
    int i, j;
    int temp;
    //選擇法排序
    for (i = 0; i < n - 1; i++)
    {
        for (j = i + 1; j < n; j++)
        {
            if (a[i] > a[j])
            {
                temp = a[i];
                a[i] = a[j];
                a[j] = temp;
            }
        }
    }
}


執行結果如下

在上面的程序中,數組a作爲一個參數被傳入函數sort_array()和print_array(),跟它同時被傳入的還有數組長度n,爲什麼需要這兩個參數?
以函數print_array()爲例

void print_array(int *arr, int len)
{            //int型有32位,4個字節,arr[x]也是32位,4個字節
    int n = sizeof(arr) / sizeof(arr[0]);//元素個數
    printf("指針型數組長度%d\n",n);
    int i = 0;
    for ( i = 0; i < len; i++)
    {
        printf("%d ",arr[i]);
    }
    printf("\n");
}

可以看到,數組 a 被交給了形參 int *arr 這就是一個標準的指針,而對於函數print_array()來說,不論 a 是個指針、地址、數組名甚至是一個NULL,它都會被當做一個指針使用,C語言就是這麼單純不做作。
不過這也帶來了一個問題,它把 a 當成指針了,那數組的長度怎麼獲得呢?只通過 a 本身是怎麼也不可能知道的。就像是print_array()的第3、4行

int n = sizeof(arr) / sizeof(arr[0]);//元素個數
    printf("指針型數組長度%d\n",n);

這句話使用了算數組arr中的元素個數的,很常見,它的輸出結果在上面就出現過了,n = 1,也就是說在arr中數組長度這個信息是不存在的,這就是爲什麼
void print_array(int *arr, int len)會用到第二個參數int len,它的作用就是告訴print_array()我給你傳進去的數組它有多長。

總的來說,這篇博客想表達的只有一句話:
如果數組作爲函數參數,數組形參退化爲指針
————————————————
版權聲明:本文爲CSDN博主「三日凌空」的原創文章,遵循 CC 4.0 BY-SA 版權協議,轉載請附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/weixin_42182035/article/details/98853900

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