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

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

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

在《C專家編程》10.3節的小啓發裏講的很透徹:(如下這段文字及對比必定要認真分析!)函數

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

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

實參                                                     所匹配的形參code

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

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

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

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

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

栗子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:

相關文章
相關標籤/搜索