string 是 char 的 20 元素数组 - 您可以存储最多 19 个字符的 字符串(需要为字符串终止符保留一个元素),或者您可以存储not 表示字符串的 20 个字符序列(如哈希值或其他内容)。
除非它是sizeof 或一元& 运算符的操作数,否则将转换类型为“T 的N 元素数组”的表达式(“衰减”)类型为“指向T”的表达式,其值将是数组第一个元素的地址。
所以,如果您将 string 作为参数传递给函数,如下所示:
f( string );
函数实际接收的是一个指针值:
void f( char *somestring ) { ... }
在函数参数声明的上下文中(仅在该上下文中),T a[N] 和 T a[] 都被视为 T *a,因此您可以将 f 声明为任何一个
void f( char somestring[20] ) { ... }
或
void f( char somestring[] ) { ... }
也是。
下标运算符[] 被定义为处理指针表达式和数组表达式,因此您仍然可以像任何其他数组一样使用[] 来索引somestring:
void f( char *somestring )
{
int i = 0;
while ( somestring[i++] )
{
// do something interesting with somestring[i]
}
}
那么,如果void f( char *somestring ) 与void f( char somestring[] ) 相同,那么我们将如何理解
void f( char *somestring[] )
?
在这种情况下,很明显somestring 是一个指针数组 char,类似于
char *strings[] = {"foo", "bar", "bletch", ... };
每个strings[i] 存储相应字符串文字的地址,而不是字符串本身的内容。同理,原型也可以写成
void f( char **somestring ) { ... }
或
void f( char *somestring[N] ) { ... }
在这种情况下,somestrings 的一件事不是是char 的二维数组。如果 strings 已被声明
#define N ... // number of strings
#define M ... // maximum length of string
char strings[N][M+1] = {"foo", "bar", "bletch", ... };
那么,如果我们将strings 传递给f,它将“衰减”为
void f( char (*somestrings)[M+1] ) { ... }
strings 的类型是“char 的 M+1 元素数组的 N 元素数组”,因此表达式“衰减”为“char 的 M+1 元素数组的指针” .