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

Posted

技术标签:

【中文标题】[方括号]和*星号之间的区别【英文标题】:Difference between [square brackets] and *asterisk 【发布时间】:2010-12-19 22:16:38 【问题描述】:

如果你写一个像这样的 C++ 函数

无效 readEmStar( int *arrayOfInt )

vs 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 ) ;

【问题讨论】:

【参考方案1】:

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

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


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[],因为很明显你想要传入一个数组,而不是单个元素的地址。

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


进一步阅读:

请看这篇题为Arrays are not the same as pointers!的帖子

【讨论】:

由于数组和指针在 C++ 中非常相似,也许您可​​以快速补充一下区别(堆栈与堆等) 在readEmSquare中,检查sizeof(arrayOfInt)会返回4,它是一个指针 查看我的注释,了解何时使用 char[] 而不进行初始化。 :) - 就风格而言,它是否重要/哪个作为函数的参数? @tloach:没有“堆栈与堆”的区别。指针不必指向堆。【参考方案2】:

C++ 标准 13.1.3

——不同的参数声明 仅在指针 * 与数组 [] 中 是等价的。也就是数组 声明调整为 指针声明(8.3.5)。只有 第二个和后续数组维度 在参数类型中很重要 (8.3.4)。 [示例:

 int f(char*);
 int f(char[]);  // same as f(char*);
 int f(char[7]);  // same as f(char*);
 int f(char[9]);  // same as f(char*);
 int g(char(*)[10]);
 int g(char[5][10]);  // same as g(char(*)[10]);
 int g(char[7][10]);  // same as g(char(*)[10]);
 int g(char(*)[20]);  // different from g(char(*)[10]);

——结束示例]

【讨论】:

好例子!我一直想知道..所以如果你指定它,编译器会丢弃这个数字,基本上,除非它是 2D 或更多,在这种情况下,只保留最后一个数字。【参考方案3】:

您的两个代码之间没有区别,除了明显不同的样式。在这两种情况下,数组都是通过引用而不是值传递的,因为函数参数type *xtype x[] 在语义上是相同的。

【讨论】:

此处不通过引用传递数组(是的,在 C++ 中也可以通过引用传递数组)。相反,数组在传递给函数时会衰减为指向第一个元素的指针,该元素是按值传递的。不过,代码之间没有区别。【参考方案4】:

关于风格问题,我会伸出脖子说 int *arrayOfInt 更好。无论您使用哪种语法,您都在传递一个指针,并且类型应该清楚地表明这一点。

这只是我的意见。

【讨论】:

我会伸出我的脖子,同意:)【参考方案5】:

这两个表达式是等价的。它们各自计算为数组 arrayOfInt 的第一个元素的地址。

【讨论】:

以上是关于[方括号]和*星号之间的区别的主要内容,如果未能解决你的问题,请参考以下文章

带括号或方括号的箭头函数之间的区别[重复]

TypeScript - import ... 和 import ... 之间的区别(带花括号)

使用括号 (`[]`) 和点 (`.`) 表示法之间的区别 [重复]

javascript中点表示法和括号表示法之间的区别[重复]

带和不带引号和括号的 setTimeout 之间的区别

React:带大括号的参数与不带大括号的参数之间的区别