不管是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;
}
指針與數組難以了解的地方基本上就是這些了,把以上的概念搞懂,數組與指針也就沒什麼好怕的。