int(* arr)[5]表示arr是指向5个整数数组的指针.现在究竟是什么指针?
如果我声明int arr [5],其中arr是指向第一个元素的指针,它是一样的吗?
这两个例子的arr是一样的吗?
如果没有,那究竟什么是指向数组的指针?
如果我声明int arr [5],其中arr是指向第一个元素的指针,它是一样的吗?
这两个例子的arr是一样的吗?
如果没有,那究竟什么是指向数组的指针?
解决方法
在运行时,指针是一个“只是一个指针”,无论它指向什么,差异是语义的;与指向元素的指针相比,指向数组的指针传达了一种不同的含义(对编译器)
在处理指向数组的指针时,您指向的是指定大小的数组 – 编译器将确保您只能指向该大小的数组.
即此代码将编译
int theArray[5]; int (*ptrToArray)[5]; ptrToArray = &theArray; // OK
但这会打破:
int anotherArray[10]; int (*ptrToArray)[5]; ptrToArray = &anotherArray; // ERROR!
处理指向元素的指针时,可以指向内存中具有匹配类型的任何对象. (它甚至不一定需要在数组中;编译器不会做出任何假设或以任何方式限制您)
即
int theArray[5]; int* ptrToElement = &theArray[0]; // OK - Pointer-to element 0
和..
int anotherArray[10]; int* ptrToElement = &anotherArray[0]; // Also OK!
总之,数据类型int *并不意味着任何数组知识,但数据类型int(*)[5]意味着一个数组,它必须包含5个元素.