1. 程式人生 > >C語言之陣列做引數退化問題

C語言之陣列做引數退化問題

先來個氣泡排序的簡單實現來說明整個問題:

#include"stdio.h"
#include"stdlib.h"

void print(int a[3], int num) {
    for (int i = 0; i < num; i++)
        printf("%d ", a[i]);
    printf("\n");
}

void sortfunc(int a[3], int num) {
    for (int i = 0; i < num; i++) {
        for (int j = i + 1; j < num; j++)
            if
(a[i] > a[j]) { int temp = a[i]; a[i] = a[j]; a[j] = temp; } } } int main() { int a[] = {56, 23, 112, 76, 1, 62}; int num = _countof(a); printf("排序前:\n"); print(a, num); sortfunc(a, num); printf("排序後:\n"); print
(a, num); system("pause"); return 0; }
void print(int a[3], int num)
void sortfunc(int a[3], int num)

這裡的兩個被調函式的引數都是通過陣列來實現的,可以看到實際的陣列a的長度是6,這兩個被調函式陣列中填的是3,但並沒有什麼卵用,看下結果:

這裡寫圖片描述

可以看到仍然完整的打印出了整個字串,並且完整排序了。那就可以把兩個被調函式改成:

void print(int a[], int num)
void sortfunc(int a[], int num)

只需注意引數的變化,改成這樣了,顯然可以繼續改:

void print(int *a, int num)
void sortfunc(int *a, int num)

可以看到最終陣列引數退化成了指標,那就來證明一下是不是真的退化成指標了呢:

#include"stdio.h"
#include"stdlib.h"

void print(int a[], int num) {
    for (int i = 0; i < num; i++)
        printf("%d ", a[i]);
    printf("\n");
}

void sortfunc(int a[], int num) {
    printf("sortfunc中a的空間大小: %d\n", sizeof(a));

    for (int i = 0; i < num; i++) {
        for (int j = i + 1; j < num; j++)
            if (a[i] > a[j]) {
                int temp = a[i];
                a[i] = a[j];
                a[j] = temp;
            }
    }
}


int main() {
    int a[] = {56, 23, 112, 76, 1, 62};

    printf("main中a的空間大小: %d\n", sizeof(a));
    int num = _countof(a);
    printf("排序前:\n");
    print(a, num);

    sortfunc(a, num);
    printf("排序後:\n");
    print(a, num);
    system("pause");
    return 0;
}

輸出結果:

這裡寫圖片描述

可以看到實參a的大小的4*6 = 24,而被調函式中a的大小變成的指標的大小:4。

小結:

1、陣列做函式引數會退化成指標。
正確的做法:把陣列的首地址和陣列的有效長度傳給被調函式。

2、實參的a和形參的a的資料型別本質是不同的,一個是陣列,一個是指標;

3、對於形參中的陣列,編譯器會把它當成指標處理,這裡的原因是指標作為C語言的一個特色,主調函式與被調函式是通過指標來操作記憶體的,對於編譯器來說指標更加方便。

*4、形參寫在函式內與寫在函式上是一樣的,只不過形參寫在函式上具有對外的屬性而已。

形參寫在函式上:

void sortfunc(int *a, int num)

形參寫在函式內:


void sortfunc()
{
    int *a;
    int num;
}

比如:

void func3(int b) {
    b = 100;
}

這樣只是把實參的數值初始化了b的值,其效果跟形參寫在函式裡面是一樣的。

void func3() {
    int b;
    b = 100;
}