zoukankan      html  css  js  c++  java
  • 二维数组及二维指针的传递及一些思考(转)

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

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

    在《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

  • 相关阅读:
    css页面自适应 媒体查询
    微信小程序rich-text中的nodes属性
    解析base64数据流---加载pdf
    用伪元素完成箭头
    搭建vue --2.x
    搭建Vue项目 vue-cli vue1.x
    Chrome----TCP
    单进程VS多进程
    线程VS进程
    Chrome---network模块---Timing
  • 原文地址:https://www.cnblogs.com/xihong2014/p/9385642.html
Copyright © 2011-2022 走看看