\[方括号\]和\*星号之间的区别

新手上路,请多包涵

如果您编写一个 C++ 函数,例如

无效 readEmStar( int *arrayOfInt )
{
}

与 C++ 函数如:

无效 readEmSquare(int arrayOfInt[])
{
}

使用 [方括号] 与 *asterisk 有什么区别,假设它们与编译器等效,是否有人有关于哪个更可取的样式指南?

为了完整起见,举个例子

void readEmStar( int *arrayOfInt, int len )
{
  for( int i = 0 ; i < len; i++ )
    printf( "%d ", arrayOfInt[i] ) ;
  puts("");
}

void readEmSquare( int arrayOfInt[], int len )
{
  for( int i = 0 ; i < len; i++ )
    printf( "%d ", arrayOfInt[i] ) ;
  puts("");
}

int main()
{
  int r[] = { 2, 5, 8, 0, 22, 5 } ;

  readEmStar( r, 6 ) ;
  readEmSquare( r, 6 ) ;
}

原文由 bobobobo 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 807
1 个回答

当您使用类型 char x[] 而不是 char *x 没有初始化 时,您可以认为它们相同。您不能在没有初始化的情况下将新类型声明为 char x[] ,但您可以接受它们作为函数的参数。在这种情况下,它们与指针相同。

当您使用类型 char x[] 而不是 char *x 进行初始化 时,它们是完全不同的 100%。


char x[]char *x 不同的示例:

 char sz[] = "hello";
char *p = "hello";

sz 实际上是一个数组,而不是一个指针。

 assert(sizeof(sz) == 6);
assert(sizeof(sz) != sizeof(char*));
assert(sizeof(p) == sizeof(char*));


char x[]char *x 相同的示例:

 void test1(char *p)
{
  assert(sizeof(p) == sizeof(char*));
}

void test2(char p[])
{
  assert(sizeof(p) == sizeof(char*));
}


传递给函数的编码风格:

你做哪一个真的不重要。有些人更喜欢 char x[] 因为很明显你想要传入一个数组,而不是单个元素的地址。

通常这已经很清楚了,因为您将有另一个参数用于数组的长度。


进一步阅读:

请参阅这篇题为 数组与指针不同的帖子!

原文由 Brian R. Bondy 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题