之前写程序一直没注意到,今天写了个函数要传入二维数组做参数,形参直接写了char** ,然后IDE提示不兼容,编译时也有警告,才细细研究了这个问题。

    对于char*,编译器所理解的是这是一个指针ppc,它指向的是一个char型的指针pc,而pc指向的是一个char型变量c。
    对于char[][n],编译器理解它是一个二维数组,但实际存储方式上是连续存储。所以它本质上是一个一重指针,而不是二重指针。
    无标题.png
    以下代码可以说明问题:

    1. #include <stdio.h>
    2. void f1(char **s)
    3. {
    4. char *line = s[0];
    5. printf("%llx\n", line);
    6. }
    7. void f2(char s[][1024])
    8. {
    9. char *line = s[0];
    10. printf("%llx\n", line);
    11. }
    12. int main()
    13. {
    14. char s[20][1024];
    15. sprintf(s[0], "12345678910");
    16. printf("%llx\n", s);
    17. f1((char **)s);
    18. f2(s);
    19. return 0;
    20. }

    使用ubunet18, 64位,gcc 9.3.0编译后运行得出:
    image.png
    f1中s被理解为char**,于是line的取值为s指向区域的前8个字节,这里涉及ASCII码和小端序的问题,本文暂不讨论。而在f2中,s被理解为char [][1024] ,line正确地指向了s的开始处。