int *ptrs[10]; //ptrs 是含有10个指针的数组
int &refs[10]; //不合法,没有引用数组
int (*Parray)[10] = &arr; // Parray 指向一个含有 10 个整数的数组
// (*Parray)[0] = arr[0]。Parray指向的是数组arr的首地址 (第一个元素的地址??)。
// 值得注意的是,星号 * ,即解引用与指针指示符 的优先级比 [] 低
// 所以是 (*Parray)[0] = arr[0],而非 *Parray[0] = arr[0]
// 也可以简单理解为 (*Parray) 是 arr 的别名
int (&arrRef)[10] = arr; // arrRef 引用一个含有 10 个整数的数组
// 即 arrRef 是 arr 的别名, arrRef[0] = arr[0],arrRef[2] = arr[2];
// 通常,类型修饰符是从右往左依次绑定。即解读时 **从右往左** 进行解读。
// !但对于复杂的数组声明,需要**从内向外**解读。
int *(&arry)[10] = ptrs;
// 首先知道 arry 是一个引用,观察右边可知,引用的对象是一个大小为 10 的数组
// 往左,数组的类型元素的指向 int 的指针
// 故含义为:arry 是一个含有 10 个指针的数组的 引用
测试代码 1:int (*Parray)[10] = &arr;
int main() {
int arr[5] = {1, 2, 3, 4, 5};
int (*p)[5] = &arr;
cout << (*p)[1] << " " << (*p)[2] << " " << (*p)[4] << endl;
return 0;
}
测试代码 2: 关于上述代码指针 p 指向的地址
int main() {
int arr[5] = {1, 2, 3, 4, 5};
int (*p)[5] = &arr;
cout << *p << " " << arr << std::endl;
cout << &arr[0];
return 0;
}
///输出:CLion 得到的是三个相同的结果
测试代码 3: int (&arrRef)[10] = arr;
int main() {
int arr[5] = {1, 2, 3, 4, 5};
int (&p)[5] = arr;
cout << p[1] << " " << p[2] << " " << p[4] << endl;
return 0;
}