C++中的数组和指针
先看两个定义(声明)
int* aryp[10];
int (*pary)[10];
aryp 是一个10个元素的数组,数组中元素类型为int*
pary 是一个指针,是指向数组的指针,这个被指的数组的类型为 int[10]
这样看pary的定义会clear一点
typdef int INT_ARY_TEN[10];
INT_ARY_TEN* pary;
C++是一种强类型(strong typed)语言,C++中有一组特殊的type:数组
数组的类型不单只跟元素的类型相关,还与元素的个数相关。
int aten[10];
int anine[9];
则 aten 的type 和 anine 的type 是不一样的,
aten的类型为 int[10], anine的类型为 int[9],而不是通常认为的int* const,
尽管我们确实可以把它当作int* const 用。这点跟Java不一样,在Java中他们两的类型都是Array
数组类型还有一个特殊之处,他们不能作为函数的参数和返回值类型
void foo(int arg[10]) {
}
arg的类型其实是int* const,跟那个10一点关系也没有,甚至[]里不写任何东西都没有关系。
这也是为什么有人说数组名就是常量指针的原因。
除了函数,数组还不能作为typeid的参数
typeid(aten).name() 是会返回 "int*" 的
正是因为这个原因
typeid(aten) == typeid(anine) 会返回true
aten, anine在传进去的时候,类型都变成 int* const了 (typeid不记录常量信息,所以cosnt去掉了)
既然数组也是一种类型,则由*操作符就可以定义另外一种类型:指向数组的指针,例如开始的那个pary,可以这样定义
int (*pary)[10] = &aten;
而
int (*pary)[10] = &anine; 是不合法的。
编译器抱怨说:cannot convert from 'int (*)[9]' to 'int (*)[10]'