二維數組及二維指針的傳遞及一些思考


二維數組和二位指針在程序知識中是一個難點,往往會將人弄得頭昏眼花。總結一下這個難點的相關問題。

二維數組,顧名思義就是數組的數組;二維指針是指針的指針。首先,我們來看看二維數組和二維指針等價的問題。

在《C專家編程》10.3節的小啟發里講的很透徹:(以下這段文字及對比一定要認真分析!)

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

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

實參                                                     所匹配的形參

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

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

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

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

可仔細體會一下上述表格,如果能理解,那是極好的,如果不能,我將舉個栗子來幫助理解。

栗子1:

 1 #include <stdio.h>
 2 #include <string.h>
 3 
 4 void func(char **ptr)
 5 {
 6     char arry[6][30] =
 7     {
 8         "ABCDEFG",
 9         "HIJKLMN",
10         "OPQ",
11         "RST",
12         "UVW",
13         "XYZ",
14     };
15     ptr = arry;
16 }
17 
18 int main(int argc, char *argv[])
19 {
20     char **ptr = NULL;
21     func(ptr);
22     printf("%s\n", ptr);
23     return 0;
24 }

這個栗子不多解釋,完全錯誤的傳遞。

 

栗子2:

#include <stdio.h>
#include <string.h>

void func(char **ptr)
{
    char *arry[30] =
    {
        "ABCDEFG",
        "HIJKLMN",
        "OPQ",
        "RST",
        "UVW",
        "XYZ",
    };
    ptr = arry;
}

int main(int argc, char *argv[])
{
    char **ptr = NULL;
    func(ptr);
    printf("%s\n", ptr);
    return 0;
}

此例中,prt = arry,正確,但是main函數不會返回arry的內容。

 

栗子3:

 1 #include <stdio.h>
 2 #include <string.h>
 3 #include <malloc.h>
 4 
 5 void func(char **ptr)
 6 {
 7     char arry[6][30] =
 8     {
 9         "ABCDEFG",
10         "HIJKLMN",
11         "OPQ",
12         "RST",
13         "UVW",
14         "XYZ",
15     };
16     memcpy(ptr, arry, sizeof(arry));
17 }
18 
19 int main(int argc, char *argv[])
20 {
21     char **ptr = NULL;
22     ptr = (char **)malloc(180);
23     func(ptr);
24     printf("%s\n", ptr);
25     free(ptr);
26     return 0;
27 }

能返回arry[0].

 

栗子4:

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM