那么什么时候数组&指针是相同的呢?
在c语言的标准中有如下说明:
1:表达式中的数组名被编译器当作一个指向该数组的第一个元素的指针。
2:下标总是于指针的偏移量相同。
3:在函数的声明中,数组名被编译器当作指向这个数组的第一个元素的指针。
对于第一点比如:
int a[10],*p,i=2;
有几种访问a[i]的方式,作用是一样的。
[1]:p=a;p[i];
[2]:p=a;*(p+i);
[3]:p=a+1;*p;
由此♂得出,对数组下标的引用总是可以写成“一个指向数组首地址的指针&偏
移量的和”
对于第三点的理由很简单,数组可能很大,如果作为形参也用传值的方式的话没
那么时间&空间上面来说是实在过不去的。
多维数组
♂知道一维数组的名字就是一个指针常量。那么多维数组也差不多。唯一的区别
就是,多位数组第一维实际上指向的是另外一个数组。
例如:
int max[3][4];
那么,max实际上是一个指向10个int元素的指针。
max+1就是指向max的下一行的10个元素。
*(max+1)也是一个指针,也许有点难理解,那么这么看吧.max[1]是什么?是一个
数组,那么这个数组名max【1】不就是一个指针么?数组名的值是个常量指针。
它指向数组的第一个元素。max[1]=*(max+1);
例子:
#include<iostream>
using namespace std;
int main()
{
int a[3][2]={1,1,3,5,4,7};
cout<<a<<" "<<*(a+1)<<" "<<&a<<" "<<a[0]<<endl;
system("pause");
}
可以看出上面的观点。*(a+1)仍然是一个指针,指向当前行的首元素。
那么自然,*(max+1)+5;就是指向当前行的第6个元素了。
现在*(*(max+1)+5)才是对int的解引用,访问了那个整型变量。
指向数组的指针
int vector[10],*vp=vector;//合法,指针指向数组首元素。
int vector[3][10],*vp=vector;//不合法,在这里,vp是一个指向整型的指针,
但是vector却是一个指向整型数组的指针,在这里类型不匹配。
正确的声明应该是
int (*vp)[10]=vector;//按照在《怎么读一个很长的声明中》说得,这个应该读
成:vp是一个指向有10个整型元素的指针。ok 类型匹配了。这个时候vp指向
vector的第一行。
也许这不能满足你的要求,你希望有一个指针能遍历这个数组的所有元素,而不
是现在只能一行一行的取值。
那么这两个可以满足:
int *p=&vector[0][0];
int *p=vector[0];
作为函参数的多维数组
上面说过了,数组作为函数参数是作为指针传递的。多维数组也是一样。但是区
别在于多维数组的每个元素本身是另外一个数组,编译器需要知道它的维数。
例如:
int vector[3][4];
这个二维数组传递给函数的时候要这么写。
void fun(int (*p)[4]);
or
void fun(int p[][4]);
其中第二维是必须的,因为编译器需要知道这个维长度才能对下标求值。
关于二维数组传参常犯的错误就是
void fun(int **p);
看出来了么?这个指针根本没有任何关于维数的声明,所以数错误的。
--参考书籍《c&指针》《c专家编程》