【问题标题】:Passing an array of strings as an argument into a double pointer parameter将字符串数组作为参数传递给双指针参数
【发布时间】:2023-04-08 11:18:02
【问题描述】:

对于以下代码:

char* fcn(char **para){

}

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

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

【问题讨论】:

  • 函数有什么作用?!尽管它的返回类型不是 void,但它甚至什么也不返回。
  • 抱歉,它做了一些事情,但我删除了其他所有内容,以便更好地突出我的观点。它应该只返回一个char * 类型的字符串。

标签: c pointers arguments parameter-passing implicit-conversion


【解决方案1】:

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

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

例如,如果您声明了类似的函数

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

【讨论】:

    【解决方案2】:

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

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

    如果您要使用&amp;arg,这是数组衰减的少数次数之一,并且表达式的类型为char *(*)[3],即指向3个元素的数组的指针char * 类型。这与char ** 非常不同。

    【讨论】:

      猜你喜欢
      • 2012-01-24
      • 2019-04-24
      • 2018-05-14
      • 2012-11-23
      • 2012-07-26
      • 1970-01-01
      • 1970-01-01
      • 2013-01-25
      相关资源
      最近更新 更多