那么什么时候数组&指针是相同的呢? 对于第一点比如: 由此♂得出,对数组下标的引用总是可以写成“一个指向数组首地址的指针&偏 移量的和” 对于第三点的理由很简单,数组可能很大,如果作为形参也用传值的方式的话没 那么时间&空间上面来说是实在过不去的。
就是,多位数组第一维实际上指向的是另外一个数组。 例如: 数组,那么这个数组名max【1】不就是一个指针么?数组名的值是个常量指针。 它指向数组的第一个元素。max[1]=*(max+1); using namespace std; int main() 可以看出上面的观点。*(a+1)仍然是一个指针,指向当前行的首元素。 现在*(*(max+1)+5)才是对int的解引用,访问了那个整型变量。 指向数组的指针
但是vector却是一个指向整型数组的指针,在这里类型不匹配。 int (*vp)[10]=vector;//按照在《怎么读一个很长的声明中》说得,这个应该读 成:vp是一个指向有10个整型元素的指针。ok 类型匹配了。这个时候vp指向 vector的第一行。 也许这不能满足你的要求,你希望有一个指针能遍历这个数组的所有元素,而不 是现在只能一行一行的取值。
上面说过了,数组作为函数参数是作为指针传递的。多维数组也是一样。但是区 别在于多维数组的每个元素本身是另外一个数组,编译器需要知道它的维数。 int vector[3][4]; 其中第二维是必须的,因为编译器需要知道这个维长度才能对下标求值。 “多位数组第一维实际上指向的是另外一个数组。”这句话也错,C实现的是数组的数组,不是多维数组,多维数组与数组的数组有本质的区别,多维数组根本就不是“第一维实际上指向的是另外一个数组”,这句话用在数组的数组上才是正确的。 数组的数组与多维数组的主要区别,就在于数组的数组各维之间的内在关系是一种鲜明的层级关系。对于数组int a[7][8][9],如果要访问元素a[4][5][6],它的地址就得这样获得:先通过*(a+4)求出第一维第5个数组的地址,然后计算第二维第6个数组的地址*(*(a+4)+5),最后才能得出a[4][5][6]元素的地址:*(*(a+4)+5)+6。这个过程是需要层层解析的。 而真正的多维数组并没有这么多“束缚”,由于各维之间不是层级关系,元素a[4][5][6]的偏移量可以这样直接获得:(4x8x9+5x9+6)xsizeof(int),再加上数组的首地址就是元素a[4][5][6]的地址了。 但是,c语言的数组能够这样用首地址加上(4x8x9+5x9+6)xsizeof(int)的形式来访问元素吗?显然是不行的。根本原因就在于C语言的地址不但有类型,还有层级关系。就是这种层级关系造成了C语言只能用数组的数组当作多维数组。如果C语言非得要实现真正的多维数组,那么地址与指针的概念就得重新改写了。 为什么不可以呢? |
转自http://hi.baidu.com/%B4%F3%D1%A9%CE%DE%BA%DB%D2%BB/blog/item/80b1ccfb69384c126c22ebc1.html谢谢原作者