和*星号之间的区别

如果你写一个C ++函数

 void readEmStar(int * arrayOfInt)
 {
 }

与一个C ++函数类似:

 void 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 ) ; } 

当你使用typeschar x[]代替char *x 而没有初始化的时候 ,你可以认为它们是一样的。 你不能在没有初始化的情况下声明一个新的types为char x[] ,但是你可以接受它们作为函数的参数。 在这种情况下,它们与指针相同。

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

通常情况下,这已经很清楚了,因为你将拥有数组长度的另一个参数。


进一步阅读:

请看这篇题为“ 数组不是一样的指针!

C ++标准13.1.3

– 仅在指针*和数组[]之间不同的参数声明是等价的。 也就是说,数组声明被调整为一个指针声明(8.3.5)。 在参数types(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]); 

– 例子]

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

在风格的问题,我会坚持我的脖子,并说int * arrayOfInt更好。 你使用哪种语法是传递一个指针,types应该清楚。

这只是我的看法。

这两个expression式是等价的。 它们每个都计算数组arrayOfInt的第一个元素的地址。