天天看点

解析数组与指针的各种用法(包括函数指针、指针函数)

不管是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;

 }

指针与数组难以理解的地方基本上就是这些了,把以上的概念搞懂,数组与指针也就没什么好怕的。