和*星号之间的区别
如果你写一个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 *x
和type x[]
在语义上是相同的。
在风格的问题,我会坚持我的脖子,并说int * arrayOfInt更好。 你使用哪种语法是传递一个指针,types应该清楚。
这只是我的看法。
这两个expression式是等价的。 它们每个都计算数组arrayOfInt的第一个元素的地址。