提问人:Claire 提问时间:4/30/2021 最后编辑:Vlad from MoscowClaire 更新时间:5/1/2021 访问量:798
将字符串数组作为参数传递到双指针参数中
Passing an array of strings as an argument into a double pointer parameter
问:
对于以下代码:
char* fcn(char **para){
}
int main(void){
char *arg[] = {"XX", "YY", "ZZ"};
char *s = fcn(arg);
}
为什么当我们将参数传递到 中的函数时,我们不需要做? 在我看来是一个单指针,所以我们不应该像 fcn() 的参数一样用双指针引用它吗?char *s = fcn(arg);
&arg
arg[]
&ptr
char* fcn(char **para)
答:
在大多数表达式中使用数组时,数组会衰减为指向数组第一个元素的指针。
arg
声明为 的数组 ,因此指向数组元素的指针的类型为 。char *
char **
如果你要使用 ,那是为数不多的数组不会衰减并且表达式将具有 type ,即指向 3 个元素的数组的指针。这与 .&arg
char *(*)[3]
char *
char **
如果有一个数组,然后在表达式中使用,则该数组将隐式转换为指向其第一个元素的指针(极少数例外)。
另一方面,具有数组类型的函数参数由编译器调整为指向数组元素类型的指针。
例如,如果您声明了一个函数,例如
char* fcn( char *para[] );
然后编译器将按以下方式调整函数声明
char* fcn( char **para );
您甚至可以在程序中包含这两个声明,尽管编译器可以发出一条消息,指出存在冗余声明。
所以如果你有这样的功能
char* fcn( char *para[] );
在调用方中,你有一个这样的数组
char *arg[] = {"XX", "YY", "ZZ"};
然后,函数参数和调用方中声明的数组具有具有相同元素类型的数组类型。因此,您可以将函数称为
fcn( arg );
用作参数的数组将隐式转换为指向其第一个元素的指针。
数组元素的类型为 。因此,指向数组元素的指针将具有 .char *
char **
这就是这个函数调用
fcn( arg );
相当于
fcn( &arg[0] );
取消引用指针,您将获得数组中第一个元素,其类型为 。char *
如果要写表达式
&arg
则表达式的类型将是 。取消引用指针,您将获得 类型的原始数组。char * ( * )[3]
char *[3]
这是一个示范程序
#include <stdio.h>
void f( char **arg )
{
printf( "sizeof( *arg ) = %zu\n", sizeof( *arg ) );
}
void g( char * ( *arg )[3] )
{
printf( "sizeof( *arg ) = %zu\n", sizeof( *arg ) );
}
int main(void)
{
char * arg[] = { "XX", "YY", "ZZ" };
f( arg );
g( &arg );
return 0;
}
程序输出为
sizeof( *arg ) = 8
sizeof( *arg ) = 24
评论
char *