如果你编写像
这样的C ++函数void readEmStar( int *arrayOfInt ) { }
vs C ++函数,如:
void readEmSquare( int arrayOfInt[] ) { }
使用[方括号]和*星号之间有什么区别,是否有人有一个风格指南,假设它们与编译器相同?
为了完整性,一个例子
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 ) ;
}
答案 0 :(得分:65)
当您使用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[]
,因为很明显你想传入一个数组,而不是单个元素的地址。
通常这已经很清楚,因为你有另一个参数来表示数组的长度。
进一步阅读:
请参阅此帖子,标题为Arrays are not the same as pointers!
答案 1 :(得分:13)
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]);
-end example]
答案 2 :(得分:3)
除了不同的风格之外,你的两个代码没有区别。在这两种情况下,数组都是通过引用而不是值传递的,因为函数参数type *x
和type x[]
在语义上是相同的。
答案 3 :(得分:1)
在样式问题上,我会伸出脖子说int * arrayOfInt更好。您使用哪种语法传递指针,类型应该清楚。
这只是我的意见。
答案 4 :(得分:-1)
这两个表达式是等价的。它们各自计算数组arrayOfInt的第一个元素的地址。