[方括号]和*星号之间的区别
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 *x
和type x[]
在语义上是相同的。
【讨论】:
此处不通过引用传递数组(是的,在 C++ 中也可以通过引用传递数组)。相反,数组在传递给函数时会衰减为指向第一个元素的指针,该元素是按值传递的。不过,代码之间没有区别。【参考方案4】:关于风格问题,我会伸出脖子说 int *arrayOfInt 更好。无论您使用哪种语法,您都在传递一个指针,并且类型应该清楚地表明这一点。
这只是我的意见。
【讨论】:
我会伸出我的脖子,同意:)【参考方案5】:这两个表达式是等价的。它们各自计算为数组 arrayOfInt 的第一个元素的地址。
【讨论】:
以上是关于[方括号]和*星号之间的区别的主要内容,如果未能解决你的问题,请参考以下文章
TypeScript - import ... 和 import ... 之间的区别(带花括号)
使用括号 (`[]`) 和点 (`.`) 表示法之间的区别 [重复]