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

时间:2009-11-24 15:13:19

标签: c++ arrays function

如果你编写像

这样的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 ) ;
}

5 个答案:

答案 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 *xtype x[]在语义上是相同的。

答案 3 :(得分:1)

在样式问题上,我会伸出脖子说int * arrayOfInt更好。您使用哪种语法传递指针,类型应该清楚。

这只是我的意见。

答案 4 :(得分:-1)

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