天天看點

解析數組與指針的各種用法(包括函數指針、指針函數)

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

 }

指針與數組難以了解的地方基本上就是這些了,把以上的概念搞懂,數組與指針也就沒什麼好怕的。