可以将指针的临时数组传递给C中的函数吗?

可以将指针的临时数组传递给C中的函数吗?,c,arrays,pointers,temporary,C,Arrays,Pointers,Temporary,在下面的代码中,我想用临时指针数组调用函数f或f2,如第33行和第39行 #include <stdio.h> void f( const char** const p, size_t num ) { size_t i; for ( i = 0; i < num; ++i ) { printf( "%s\n", p[ i ] ); } } void f2( const char* const p[2] ) { size_t i; for (

在下面的代码中,我想用临时指针数组调用函数f或f2,如第33行和第39行

#include <stdio.h>

void f( const char** const p, size_t num )
{
  size_t i;
  for ( i = 0; i < num; ++i )
  {
    printf( "%s\n", p[ i ] );
  }
}

void f2( const char* const p[2] )
{
  size_t i;
  for ( i = 0; i < 2; ++i )
  {
    printf( "%s\n", p[ i ] );
  }
}

void withPtrArray()
{
  const char* tmp[] = { "hello", "world" };
  const char** p;

  // This compiles/runs fine:
  f( tmp, sizeof tmp / sizeof( const char* ) );

  // This also compiles/runs fine:
  f( ( p = tmp ), 2 );

  // This does not compile - I'm not clear why.
  f( ( { "hello", "world" } ), 2 );

  // My last hope: I thought a function that explicitly took a pointer array:
  // This works...
  f2( tmp );
  // ...but this does not:
  f2( { "hello", "world" } );
}


void g( const char* const p )
{
  printf( "%s\n", p );
}

// Analog to f2()
void g2( const char p[12] )
{
  printf( "%s\n", p );
}

// These analogs with an array of chars work fine.
void withPtr()
{
  const char tmp[] = "hello world";
  const char* p = tmp;

  g( tmp );

  g( ( p = tmp ) );

  g( ( "hello world" ) );

  g2( tmp );

  g2( "hello world" );
}

int main( int argc, char* argv[] )
{
  withPtrArray();
  withPtr();
  return 0;
}
<>自从我从C迁移到C++,已经有几年了,但我不相信这是C和C++之间的语法差异问题。 是否有一种C语法允许将指针的临时数组传递给函数?

f{hello,world},2的问题是:函数的参数必须是表达式。但是,其他表达式的大括号列表本身不是表达式

可能您错误地认为{hello,world}是一个表达式,它的类型数组可能是2个字符数组。但事实并非如此。你可能已经注意到{你好};也不是有效代码:每个表达式都可以通过放入;在它之后,因此{hello}不能是表达式

以下代码也不起作用:

char *c[2];
c = { "hello", "world" };
甚至:

int y;
y = { 5 };
在这两种情况下,赋值运算符后面必须跟一个表达式;但是没有任何表达式的语法是由大括号中的内容组成的

大括号列表只能作为声明的初始值设定项出现,或以复合文字出现。大括号表示存在初始值设定项列表

声明的结构是typename和declarator,后跟不是赋值运算符的=符号,因为这不是表达式,后跟初始值设定项。一个初始值设定项可以是一个表达式,也可以是一个带括号的初始值设定项列表。这种声明的含义是,每个初始值设定项都作为声明中声明的一个对象的初始值

在代码中,可以使用复合文字:

f( (const char *[2]){ "hello", "world" }, 2 );
复合文字的结构是,它是为该类型的对象提供带有初始值设定项的typename的语法;它不是应用于某种表达式的强制转换运算符。

f{hello,world},2的问题是:函数的参数必须是表达式。但是,其他表达式的大括号列表本身不是表达式

可能您错误地认为{hello,world}是一个表达式,它的类型数组可能是2个字符数组。但事实并非如此。你可能已经注意到{你好};也不是有效代码:每个表达式都可以通过放入;在它之后,因此{hello}不能是表达式

以下代码也不起作用:

char *c[2];
c = { "hello", "world" };
甚至:

int y;
y = { 5 };
在这两种情况下,赋值运算符后面必须跟一个表达式;但是没有任何表达式的语法是由大括号中的内容组成的

大括号列表只能作为声明的初始值设定项出现,或以复合文字出现。大括号表示存在初始值设定项列表

声明的结构是typename和declarator,后跟不是赋值运算符的=符号,因为这不是表达式,后跟初始值设定项。一个初始值设定项可以是一个表达式,也可以是一个带括号的初始值设定项列表。这种声明的含义是,每个初始值设定项都作为声明中声明的一个对象的初始值

在代码中,可以使用复合文字:

f( (const char *[2]){ "hello", "world" }, 2 );
复合文字的结构是,它是为该类型的对象提供带有初始值设定项的typename的语法;它不是应用于某种表达式的强制转换运算符。

您正在查找@EugeneSh。-美丽的f const char*[{你好,世界},2;需要秘密的调味汁吗。如果你想知道要点,你应该把它作为答案贴出来。谢谢你!你在找@EugeneSh。-美丽的f const char*[{你好,世界},2;需要秘密的调味汁吗。如果你想知道要点,你应该把它作为答案贴出来。谢谢你!