将字符串数组作为参数传递到双指针参数中

Passing an array of strings as an argument into a double pointer parameter

提问人:Claire 提问时间:4/30/2021 最后编辑:Vlad from MoscowClaire 更新时间:5/1/2021 访问量:798

问:

对于以下代码:

char* fcn(char **para){

}

int main(void){
  char *arg[] = {"XX", "YY", "ZZ"};
  char *s = fcn(arg); 
}

为什么当我们将参数传递到 中的函数时,我们不需要做? 在我看来是一个单指针,所以我们不应该像 fcn() 的参数一样用双指针引用它吗?char *s = fcn(arg);&argarg[]&ptrchar* fcn(char **para)

C 指针 参数 参数传递 隐式转换

评论

0赞 Vlad from Moscow 4/30/2021
这个功能有什么作用?!它甚至不返回任何内容,尽管它的返回类型不是 void。
0赞 Claire 4/30/2021
对不起,它做了一些事情,但我删除了其他所有内容,以便我可以更好地突出我的观点。它应该只返回一个 类型的字符串 。char *
0赞 cigien 5/2/2021
这回答了你的问题吗?将指向 char 数组的指针作为函数的参数传递 - C

答:

1赞 dbush 4/30/2021 #1

在大多数表达式中使用数组时,数组会衰减为指向数组第一个元素的指针。

arg声明为 的数组 ,因此指向数组元素的指针的类型为 。char *char **

如果你要使用 ,那是为数不多的数组不会衰减并且表达式将具有 type ,即指向 3 个元素的数组的指针。这与 .&argchar *(*)[3]char *char **

1赞 Vlad from Moscow 5/1/2021 #2

如果有一个数组,然后在表达式中使用,则该数组将隐式转换为指向其第一个元素的指针(极少数例外)。

另一方面,具有数组类型的函数参数由编译器调整为指向数组元素类型的指针。

例如,如果您声明了一个函数,例如

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