二维数组及二维指针的传递及一些思考(转)

二维数组和二位指针在程序知识中是一个难点,往往会将人弄得头昏眼花。总结一下这个难点的相关问题。

二维数组,顾名思义就是数组的数组;二维指针是指针的指针。首先,我们来看看二维数组和二维指针等价的问题。

在《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
", 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
", 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
", ptr);
25     free(ptr);
26     return 0;
27 }
 

能返回arry[0].

https://www.cnblogs.com/majiangjiang/p/3706472.html

原文地址:https://www.cnblogs.com/xihong2014/p/9385642.html