例如,如果我定义一个数组
char string[20] = "something";
和功能
void f(char* somestring[])
这是什么,地址或号码,或者我该如何处理?它用于什么目的?
答案 0 :(得分:0)
首先,地址是数字。然后,键入char *foo[]
(实际上只是char **foo
)具有几种等效解释。
foo
是一个双索引的char
数组。foo
是指向char
数组的指针(即,如果字符串为null,则终止,就像字符串文字一样)。foo
是一个指向char
值的指针。它也可以以多种方式使用。
foo
是一个char二维数组;然后foo[x][y]
将在数组x
和列y
的数组中检索您的字符。foo
是指向字符串的指针。然后(*foo)[x]
为您提供字符串的第x
个字符。**foo
设置char
值,并使用*foo
更改指针指向的字符。 编辑:当然,所有这些都是可组合的并且是等效的。例如,foo[0][0]
只是(*foo)[0]
,也就是**foo
。
答案 1 :(得分:0)
string
是char
的20个元素的数组-您可以存储最多19个字符的 string (需要为字符串终止符保留一个元素),或者您可以存储20个字符的序列,这些字符 not 不能代表字符串(例如哈希值等)。
除非它是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
的2D数组。如果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元素数组”,因此表达式“衰变”为“指向M的M + 1元素数组的指针” char
”。