n0p*_*0pe 7 c++ arrays pointers
当我声明一个像这样的新数组:
int foo[5]
Run Code Online (Sandbox Code Playgroud)
是foo真正的指针数组的第一个元素?我能做到这一点:
*(foo+2)
Run Code Online (Sandbox Code Playgroud)
访问数组的第三个元素?假设我正在制作2D数组:
int foo[3][4]
Run Code Online (Sandbox Code Playgroud)
是foo现在int**?
不,'foo'在两种情况下都是数组类型,但是当表达式中的指针在'foo'时,它会隐式转换为1(指向数组的第一个元素).所有阵列都有此行为.在这种情况下,由于可以通过指针类型进行添加,但不能通过数组进行添加,因此'foo'将转换为'int*'.
*(foo+2) // 'foo' is implicitly converted into 'int *', pointing to 'foo' first element
foo + 1 //same as above
Run Code Online (Sandbox Code Playgroud)
但是现在您可能会问,"数组"类型的属性是什么以及为什么我们应该使用它,而不是指向第一个元素强制转换的隐式指针.事情是他们并不多.您可以像这样告诉类型为array的对象的大小:
sizeof(foo) //returns the size which array 'foo' occupies
Run Code Online (Sandbox Code Playgroud)
并使用'&'运算符获取它的地址:
&foo // '&foo' has type of 'int (*)[5]'
Run Code Online (Sandbox Code Playgroud)
也可以用的"数组"参考(或指针)类型,以便只接受具有指定大小的人(如果它们是仅有的指针和期望传递给衰变成这样的阵列,其是不可能的)的参数创建函数.例:
void func(int (&)[5]);
void func1(int (*arg)[5]); // should be accessed by '*arg', allow the use of null-pointers
void func2(int *); //same as the misleading 'void func2(int [5])' or 'void func2(int [6])' etc.
int foo[5];
int foo1[6];
func(foo); // 'foo' type is ('int [5]') - ok
func1(&foo); // '&foo' type is ('int (*)[5]') - ok
func(foo1); // 'foo1' type is ('int [6]') - not allowed, param type is 'int (&)[5]' !
func1(&foo1); // '&foo1' type is ('int (*)[6]') - not allowed, param type is 'int (*)[5]' !
func2(foo); // 'foo' is implicitly converted to 'int *' - ok
func2(foo1); // 'foo1' is implicitly converted to 'int *' - ok
Run Code Online (Sandbox Code Playgroud)
在第二种情况下,当数组是2D时 - 应用相同的属性.它的声明意味着:'一个3个元素的数组,类型为4个元素的数组,类型为int'所以它实际上只是一个数组数组而已.它是第一个元素转换的隐式指针,不是'int**'类型,而是'int(*)[4]',因为它的每个元素都是另一个数组.
声明也可以这样写:
int (foo[3])[4];
Run Code Online (Sandbox Code Playgroud)
另请注意,"数组"无法分配,因此它们不能通过值传递或由函数返回.我的意思是:
int funcReturningArray()[2]; //not allowed
int funcAcceptingArray(int [2]); //just converted into pointer
int funcAcceptingArray(int *); //same as above
Run Code Online (Sandbox Code Playgroud)
虽然由于遗留原因(或者因为别的东西?)而在语法上接受了数组参数,但是它们的真正含义永远不会被容忍,并且它们只是被"调整"到指针.
注意:将数组类型隐式转换为它的第一个元素的指针有时称为"指向衰减的数组".