之前写程序一直没注意到,今天写了个函数要传入二维数组做参数,形参直接写了char** ,然后IDE提示不兼容,编译时也有警告,才细细研究了这个问题。
对于char*,编译器所理解的是这是一个指针ppc,它指向的是一个char型的指针pc,而pc指向的是一个char型变量c。
对于char[][n],编译器理解它是一个二维数组,但实际存储方式上是连续存储。所以它本质上是一个一重指针,而不是二重指针。
以下代码可以说明问题:
#include <stdio.h>void f1(char **s){char *line = s[0];printf("%llx\n", line);}void f2(char s[][1024]){char *line = s[0];printf("%llx\n", line);}int main(){char s[20][1024];sprintf(s[0], "12345678910");printf("%llx\n", s);f1((char **)s);f2(s);return 0;}
使用ubunet18, 64位,gcc 9.3.0编译后运行得出:
f1中s被理解为char**,于是line的取值为s指向区域的前8个字节,这里涉及ASCII码和小端序的问题,本文暂不讨论。而在f2中,s被理解为char [][1024] ,line正确地指向了s的开始处。
