您好,登錄后才能下訂單哦!
聽到這幾個名詞不知道大家什么感受,反正我是一臉懵逼,不過我還是比較好學的,在老師的指導下,自己下去也鉆研了一下,有一些自己的見解,我想在學習過程中也有童鞋遇到了相同的問題,希望我的總結(jié)能給你帶來幫助。
首先我們先明確一下這幾個概念,知道他們都表示什么,ok,請看:
函數(shù)指針:函數(shù)指針是指向函數(shù)的指針變量。 因而“函數(shù)指針”本身首先應(yīng)是指針變量,只不過該指針變量指向函數(shù)。這正如用指針變量可指向整型變量、字符型、數(shù)組一樣,這里是指向函數(shù)。如前所述,C在編譯時,每一個函數(shù)都有一個入口地址,該入口地址就是函數(shù)指針所指向的地址。有了指向函數(shù)的指針變量后,可用該指針變量調(diào)用函數(shù),就如同用指針變量可引用其他類型變量一樣,在這些概念上是大體一致的。函數(shù)指針有兩個用途:調(diào)用函數(shù)和做函數(shù)的參數(shù)。
指針函數(shù):指針函數(shù)是指帶指針的函數(shù),即本質(zhì)是一個函數(shù)。函數(shù)都有返回類型(如果不返回值,則為無值型),只不過指針函數(shù)返回類型是某一類型的指針。
指針數(shù)組:在C語言和C++語言中,數(shù)組元素全為指針的數(shù)組稱為指針數(shù)組。
一維指針數(shù)組的定義形式為:“類型名 *數(shù)組標識符[數(shù)組長度]”
數(shù)組指針:數(shù)組名的指針,即數(shù)組首元素地址的指針。即是指向數(shù)組的指針。
以上這些來自百度百科,概念還是有些抽象,不知所云,估計還是不知道怎么區(qū)分。ok接下來我談下我的看法。
按照我的理解,不管是函數(shù)指針還是指針函數(shù),或者說數(shù)組指針、指針數(shù)組,我們想看后兩個字,這兩個字就決定了這個東西的大前提。我們分別來看,對函數(shù)指針來說,首先它是一個指針,只不過它比較特殊,是一個指向函數(shù)的指針,所以它叫函數(shù)指針。說它特殊其實也不特殊,我們可以想一下我們聲明×××指針、字符指針等指針,他們是不是代表指向×××的指針、字符的指針,只是我們再定義命名時沒有注意,那么這樣我們就可以解釋函數(shù)指針了,指向函數(shù)的指針。后邊我會用代碼再解釋一下。那么對于數(shù)組指針,我們是不是可以理解了呢?就是指向數(shù)組的指針。寫道這里,我想起了上一篇博文,數(shù)組名,那么他就是一個數(shù)組指針。區(qū)別了這兩個,我們接著來看另外兩個,按照我前邊說的看后兩個字,對于指針函數(shù),首先來說,它是一個函數(shù),對于函數(shù)我們比較關(guān)心的有兩個比較關(guān)鍵的因素,一個是返回值,另一個是參數(shù),這里我們涉及到的就是它的返回值。有人就會問了,那為什么不是參數(shù),這個很好解釋,就從參數(shù)所處的位置就可以區(qū)分出來,好了言歸正傳,對于指針函數(shù)就是說函數(shù)的返回值是指針類型的,比如像我們常用的庫函數(shù)malloc(),就是指針函數(shù)。最后我們再說指針數(shù)組,前三個我都解釋,我想這個聰明大家就可以自己解釋,這里我還是在解釋一下,所謂指針數(shù)組,就是存儲指針的數(shù)組,至于指針數(shù)組是存儲什么類型的指針,就要看我們聲明什么類型的數(shù)組,就像我們聲明×××數(shù)組,存儲×××數(shù)組,浮點型數(shù)組,存儲浮點型數(shù)據(jù)。從概念上區(qū)分了清了,但是我們還是見了具體的東西,你不認識我,我不認識你,接下來我就來解決這個問題
為什么會出現(xiàn)什么指針函數(shù)、函數(shù)指針等,在這里我們先要再引入c語言的運算符優(yōu)先級表,這些就是由于運算符的優(yōu)先級造成的。
c語言運算符優(yōu)先級表
這里我們只關(guān)心[]、()與*的優(yōu)先級,我們可以從圖中很明顯的得知[]、()的優(yōu)先級高于*,因而標識符,就會首先與運算級高的結(jié)合,先結(jié)合的就決定了它的性質(zhì)。ok,下來我通過代碼解釋;請看下邊的代碼:
測試代碼
#include<stdio.h>
/*
**輸出兩個×××數(shù)據(jù)的最大值
*/
int Int_Max(int a, int b )
{
return a>b?a:b;
}
/*
**輸出兩個雙精度浮點數(shù)的最大值
*/
double Double_Max(double a,double b)
{
return a>b?a:b;
}
/*
**定義一個指針函數(shù)
*/
int *Fun_Arry(int x, int y)
{
static int arry3[5]= {0};
int *p;
p = arry3;
return p;
}
/*
**定義兩個函數(shù)指針,用來間接操作剛才定義的兩個函數(shù)
*/
int (*function1)(int ,int );
double (*function2)(double ,double );
int main()
{
int a = 1, b = 5; //聲明兩個×××數(shù)據(jù)
double c = 3.4, d = 3.6; //聲明兩個浮點型數(shù)據(jù)
int arry1[5] = {0}; //聲明一個×××數(shù)組
int DoubleArry_1[3][2];
int DoubleArry_2[3][3];
int *lp1 = NULL, *lp2 = NULL, *lp3 = NULL, *lp4 = NULL, *lp5 = NULL;
int *arry_2[5] ; //聲明一個指針數(shù)組,用來保存×××指針
int (*arry_3)[2]; //聲明一個數(shù)組指針,指向一個數(shù)組
int (*arry_4)[5]; //聲明一個數(shù)組指針,指向一個數(shù)組
int (*arry_5)[3][3]; //聲明一個數(shù)組指針,指向一個數(shù)組
/*
**變量arry_3是一個數(shù)組指針,它指向一個包含2 個int 類型數(shù)據(jù)的數(shù)組,即數(shù)組指針
**并且只能指向有兩個int類型數(shù)據(jù)的數(shù)組
*/
arry_3 = DoubleArry_1;
arry_4 = &arry1;
arry_5 = &DoubleArry_2;
/*
**function1和function2是我們之前聲明的函數(shù)指針,用來指向函數(shù)是指針,并且由于function1聲明為int型的,所以只能指向返回值為int型的函數(shù),
**那么對于function2函數(shù)就只能指向返回值為double型的函數(shù),因而,下邊分別讓他們分別指向了我之前定義的兩個函數(shù)。
*/
function1 = Int_Max;
function2 = Double_Max;
/*
**arry_2是一個指針數(shù)組,按照我上文說的,那它就是用來保存指針的,
**由于我在這里聲明的為×××指針數(shù)組,所以,這里我們看到保存了我個×××指針。
*/
arry_2[0] = lp1;
arry_2[1] = lp2;
arry_2[2] = lp3;
arry_2[3] = lp4;
arry_2[4] = lp5;
/*
**為了驗證函數(shù)指針的正確性,我做了一下測試前兩行我用函數(shù)名,
**直接調(diào)用函數(shù),分別得到×××、浮點型的最大值。
*/
printf("Result of origonal function---->Int_Max = %d\n",Int_Max(a,b));
printf("Result of origonal function---->Double_Max = %f\n",Double_Max(c,d));
printf("----------------------------------------------------------------\n");
printf("Result of Function Pointer ----->Int_Max = %d\n",function1(a, b));
printf("Result of Function Pointer ----->Double_Max = %f\n",function2(c, d));
return 0;
}
運行結(jié)果測試圖
測試代碼中我已經(jīng)盡可能多的給出了注釋,我在這里再重點提一個數(shù)組指針,數(shù)組指針就是指向數(shù)組的指針,注意看代碼中我用紅色標注的部分,分別聲明了三個不同類型的數(shù)組指針,arry_3是一個指向兩個×××元素的數(shù)組的指針,并且對于此指針只能指向有兩個×××元素的數(shù)組,arry_4是一個指向5個×××元素數(shù)組的指針ok,這也將涉及到上一篇博文遺留的一個問題,數(shù)組名到底是什么。arry_5是一個指向3行3列的二維數(shù)組的指針。ok,定義完了了我們來看后邊的賦值,arry_3是一個指向兩個×××元素的數(shù)組的指針,。然后用它接收了一個二維數(shù)組名,是不是有疑問,對于arry_3,不是應(yīng)該指向一個一維數(shù)組嗎?怎么把一個二維數(shù)組名給它了,首先我來告訴你,這是對的,我的上一篇博文是不是談到,數(shù)組名就是代表一個數(shù)組,其保存著該數(shù)組的首元素的地址,對于二維數(shù)組從存儲結(jié)構(gòu)上來看,首元素就是一個一維數(shù)組,所以用把二維數(shù)組名賦值給arry_3,其本質(zhì)是將一個一維數(shù)組賦并且只有兩個×××元素的數(shù)組的地址賦值給arry_3,我們接著來看,arry_4,我把一個一維數(shù)組的地址給它,這時arry_4就指向了一維數(shù)組arry1,再看最后一條,如果要操作二維數(shù)組,就要把二維數(shù)組名的地址給相同類型的數(shù)組指針。ok對于這幾個很麻煩的的概念,按照自己理解總結(jié)了一下,希望能幫到遇到同樣問題的你,最后我在總結(jié)一下今天寫的以及一些注意事項。
函數(shù)指針:就是指向函數(shù)的指針。
1、函數(shù)名就是函數(shù)的入口地址
2、指向函數(shù)的指針就是函數(shù)指針
使用函數(shù)指針是要達到 三同 即:1、函數(shù)返回值相同2、參數(shù)個數(shù)相同3、參數(shù)對應(yīng)的類型相同
3、其他類型的指針均可自增自減,但是對于函數(shù)指針不允許自增自減
指針數(shù)組:存儲指針的數(shù)組。
1、 數(shù)組中的三值合一:數(shù)組名、數(shù)組首元素地址、數(shù)組名的地址
數(shù)組名中保存首元素的地址 《 數(shù)組名取地址 代表針對整個數(shù)組取地址》
2、數(shù)組名取地址代表整個數(shù)組的地址 當要接收數(shù)組名的地址時就要定義一個數(shù)組類型的指針
3、一維數(shù)組可以通過一級指針接收數(shù)組的地址,達到引用數(shù)組并操作數(shù)組的目的,
但是二維數(shù)組卻不能通過定義二級指針來接收數(shù)組名,達到引用并操縱數(shù)組的目的。始終注意:數(shù)組名代表整個數(shù)組,然后數(shù)組名有值保存了數(shù)組首元素的地址
4、對于二維數(shù)組,從本質(zhì)上講是一個一維數(shù)組,但是每個元素是一個數(shù)組;
數(shù)組指針:就是指向數(shù)組的指針。
指針函數(shù):返回指針的函數(shù)就是指針函數(shù)。
免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。