數組和指針參數是如何被編譯器修改的

“數組名被改寫成一個指針參數”規則並不是遞歸定義的。數組的數組會被改寫成“數組的指針”,而不是“指針的指針”:

                                 實參                             所匹配的形參

數組的數組          char c[8][10];                 char (*)[10];          數組指針


指針數組             char *c[10];                   char **c;               指針的指針


數組指針(行指針)  char (*c)[10];              char (*c)[10];        不改變


指針的指針           char **c;                       char **c;               不改變


被修改成指針的只是數組名,只修改最左面的維度爲指針


zz http://blog.csdn.net/ylyuanlu/article/details/9170271

1)方法一
    my_func(int array[10][20]);
    這樣的方法雖然簡單,但同時也是作用做小的聲明方式,因爲它只能處理10行20列的int類型的數組,如果要一個更爲普通的多維數組形參的方法,使函數能操作任意長度數組。
  2)方法二
    my_func(int (*array)[20]);
    這樣可以確保他被編譯器當做一個指向20個元素的int數組的指針,但對於二維數組的參數傳遞,它並不具有通用性,因爲還有一個20感覺很糟糕。
  3)方法三
    本爲的第二小節的最後有分析過:
    main(int argc, char **argv);
    當然也可能是: 
    main(int argc, char *argv[]);
前面一種是一個指針的指針,後面一種是一個指針數組,那這裏我們就可以這樣聲明一個比較通用的可以傳遞二維數組的函數:
    my_func(int **array);或者
    my_func(int *array[]);
    這樣也可以通過最後一個指針元素設置成NULL來標識該二維數組的結束。實際上,我們真的可以通過一些技術來解決一維和二維數組的通用聲明,但是對於三維和更多維的數組都無法實現的很好,這也是C語言的一個內在限制。

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