不管是C还是C++,指针与数组都是初学者非常害怕两大“魔头”,而这两者又是在编程过程中无法避免的,因此我们必须硬着头皮理解他们!
具体讲解之前,我们必须要有一个概念,就是指针一定是指向某个地址。有了这个概念理解就更容易
1、简单指针的用法
int a=5;
int *p=&a; //p指向a的地址
cout<<p<<" "<<*p<<endl;
cout<<&a<<" "<<a<<endl;
以上两行结果完全相同。
2、指针数组与数组指针
两者的定义如下:
指针数组:array of pointers,即用于存储指针的数组,也就是数组元素都是指针,形如int* p[2];
数组指针:a pointer to an array,即指向数组的指针,形如int (*p)[2];
汉语博大精深,两组概念的字一模一样,但含义却不同,该如何区分呢?我总结了两种方法。
第一种方法,看后两个字。汉语一般是形容词在前,名词主语在后,因此只要看后面两个字便知道该变量表示的含义:
指针数组,后两个字为数组,那么该变量表示的就是一个数组,数组的元素是指针。
数组指针,后两个字为指针,那么该变量表示一个指针,指向一个数组的首地址。
第二种方法,看有无括号。
数组指针会用括号变量名和*括起来,以此表明该变量是一个指针。这种方法很直观,容易区分。
概念讲完了,举个例子加深印象。
char m[2][2]={'a','b','c','d'}; //二维数组
char* p[2]={"my","love"}; //指针数组
char (*s)[2]; //数组指针,s是指针,指向一个有2个字符的一维数组。(注意:最好不要直接在定义数组指针给 它赋值,容易出错)
s=m;
cout<<p[0]<<" "<<p[1]<<endl; //结果为 my love
cout<<*((*s)+0)<<" "<<*((*s)+1)<<" "<<*(*(s+1)+0)<<" "<<*(*(s+1)+1)<<endl; //结果为 a b c d
最后一行要注意括号的位置,还有一种简便的写法:cout<<s[0][0]<<" "<<s[0][1]<<" "<<s[1][0]<<" "<<s[1][1]<<endl;
3、指针函数与函数指针
指针函数: 它是一个函数,函数的返回值为一个指针(即地址),除此之外和其他函数没有任何区别。形如int* f(int a)
函数指针:变量是一个指针,指针指向的内容是一个函数的起始地址(简单的理解为指向一个函数),之后可以用该变量来替代该函数名,用该变量来调用函数。形如int (*f)(int) (一般把形参名省略)
例子如下
int fun1(int a,int b) //普通函数,求两数之和
{
return a+b;
}
int fun2(int a,int b)//普通函数,求两数之差
{
return a-b;
}
int* fun3(int a,int b) //指针函数,返回两数之积的地址
{
int c=a*b;
return &c;
}
int main()
{
int sum,diff;
int* s=fun3(3,4); //s为指针,指向fun3返回的结果
int (*p)(int,int); //p为函数指针
cout<<"3*4="<<*s<<endl; //结果为3*4=12
p=fun1; //首先p指向fun1
sum=p(3,4); //求3,4的和,p等价于fun1
cout<<"3+4="<<sum<<endl; //结果为 3+4=7
p=fun2; //p再指向fun2
diff=p(3,4); //求3,4的差,p等价于fun2
cout<<"3-4="<<diff<<endl; //结果为 3-4=-1
return 0;}
4、函数指针数组
最后再讲讲函数指针数组,面试的时候就问到了这个问题,当时懵逼了。。。
函数指针数组:它是在上述的函数指针的基础上再加了数组两个字,理解起来也不难,它就是个数组,数组的元素就是函数指针,
每个元素都指向一个函数。 形如:int (*p[2])(int,int) 比函数指针多了个[]
定义时需要给数组的每个元素都赋值,这个值就是普通函数的函数名。
例子如下(借用上面的fun1,fun2):
int main()
{
int (*p[2])(int,int); //p为函数指针数组,元素指向的函数有两个int形参,返回值为int
int sum,diff;
p[0]=fun1;
p[1]=fun2;
sum=p[0](3,4);
diff=p[1](3,4);
cout<<"3+4="<<sum<<endl; //结果为 3+4=7
cout<<"3-4="<<diff<<endl; //结果为 3-4=-1
return 0;
}
指针与数组难以理解的地方基本上就是这些了,把以上的概念搞懂,数组与指针也就没什么好怕的。