創(chuàng)新互聯(lián)致力于做網(wǎng)站、網(wǎng)站制作,成都網(wǎng)站設(shè)計(jì),集團(tuán)網(wǎng)站建設(shè)等服務(wù)標(biāo)準(zhǔn)化,推過標(biāo)準(zhǔn)化降低中小企業(yè)的建站的成本,并持續(xù)提升建站的定制化服務(wù)水平進(jìn)行質(zhì)量交付,讓企業(yè)網(wǎng)站從市場競爭中脫穎而出。 選擇創(chuàng)新互聯(lián),就選擇了安全、穩(wěn)定、美觀的網(wǎng)站建設(shè)服務(wù)!
聽到這幾個(gè)名詞不知道大家什么感受,反正我是一臉懵逼,不過我還是比較好學(xué)的,在老師的指導(dǎo)下,自己下去也鉆研了一下,有一些自己的見解,我想在學(xué)習(xí)過程中也有童鞋遇到了相同的問題,希望我的總結(jié)能給你帶來幫助。
首先我們先明確一下這幾個(gè)概念,知道他們都表示什么,ok,請看:
函數(shù)指針:函數(shù)指針是指向函數(shù)的指針變量。 因而“函數(shù)指針”本身首先應(yīng)是指針變量,只不過該指針變量指向函數(shù)。這正如用指針變量可指向整型變量、字符型、數(shù)組一樣,這里是指向函數(shù)。如前所述,C在編譯時(shí),每一個(gè)函數(shù)都有一個(gè)入口地址,該入口地址就是函數(shù)指針?biāo)赶虻牡刂贰S辛酥赶蚝瘮?shù)的指針變量后,可用該指針變量調(diào)用函數(shù),就如同用指針變量可引用其他類型變量一樣,在這些概念上是大體一致的。函數(shù)指針有兩個(gè)用途:調(diào)用函數(shù)和做函數(shù)的參數(shù)。
指針函數(shù):指針函數(shù)是指帶指針的函數(shù),即本質(zhì)是一個(gè)函數(shù)。函數(shù)都有返回類型(如果不返回值,則為無值型),只不過指針函數(shù)返回類型是某一類型的指針。
指針數(shù)組:在C語言和C++語言中,數(shù)組元素全為指針的數(shù)組稱為指針數(shù)組。
一維指針數(shù)組的定義形式為:“類型名 *數(shù)組標(biāo)識符[數(shù)組長度]”
數(shù)組指針:數(shù)組名的指針,即數(shù)組首元素地址的指針。即是指向數(shù)組的指針。
以上這些來自百度百科,概念還是有些抽象,不知所云,估計(jì)還是不知道怎么區(qū)分。ok接下來我談下我的看法。
按照我的理解,不管是函數(shù)指針還是指針函數(shù),或者說數(shù)組指針、指針數(shù)組,我們想看后兩個(gè)字,這兩個(gè)字就決定了這個(gè)東西的大前提。我們分別來看,對函數(shù)指針來說,首先它是一個(gè)指針,只不過它比較特殊,是一個(gè)指向函數(shù)的指針,所以它叫函數(shù)指針。說它特殊其實(shí)也不特殊,我們可以想一下我們聲明×××指針、字符指針等指針,他們是不是代表指向×××的指針、字符的指針,只是我們再定義命名時(shí)沒有注意,那么這樣我們就可以解釋函數(shù)指針了,指向函數(shù)的指針。后邊我會(huì)用代碼再解釋一下。那么對于數(shù)組指針,我們是不是可以理解了呢?就是指向數(shù)組的指針。寫道這里,我想起了上一篇博文,數(shù)組名,那么他就是一個(gè)數(shù)組指針。區(qū)別了這兩個(gè),我們接著來看另外兩個(gè),按照我前邊說的看后兩個(gè)字,對于指針函數(shù),首先來說,它是一個(gè)函數(shù),對于函數(shù)我們比較關(guān)心的有兩個(gè)比較關(guān)鍵的因素,一個(gè)是返回值,另一個(gè)是參數(shù),這里我們涉及到的就是它的返回值。有人就會(huì)問了,那為什么不是參數(shù),這個(gè)很好解釋,就從參數(shù)所處的位置就可以區(qū)分出來,好了言歸正傳,對于指針函數(shù)就是說函數(shù)的返回值是指針類型的,比如像我們常用的庫函數(shù)malloc(),就是指針函數(shù)。最后我們再說指針數(shù)組,前三個(gè)我都解釋,我想這個(gè)聰明大家就可以自己解釋,這里我還是在解釋一下,所謂指針數(shù)組,就是存儲(chǔ)指針的數(shù)組,至于指針數(shù)組是存儲(chǔ)什么類型的指針,就要看我們聲明什么類型的數(shù)組,就像我們聲明×××數(shù)組,存儲(chǔ)×××數(shù)組,浮點(diǎn)型數(shù)組,存儲(chǔ)浮點(diǎn)型數(shù)據(jù)。從概念上區(qū)分了清了,但是我們還是見了具體的東西,你不認(rèn)識我,我不認(rèn)識你,接下來我就來解決這個(gè)問題
為什么會(huì)出現(xiàn)什么指針函數(shù)、函數(shù)指針等,在這里我們先要再引入c語言的運(yùn)算符優(yōu)先級表,這些就是由于運(yùn)算符的優(yōu)先級造成的。
c語言運(yùn)算符優(yōu)先級表
這里我們只關(guān)心[]、()與*的優(yōu)先級,我們可以從圖中很明顯的得知[]、()的優(yōu)先級高于*,因而標(biāo)識符,就會(huì)首先與運(yùn)算級高的結(jié)合,先結(jié)合的就決定了它的性質(zhì)。ok,下來我通過代碼解釋;請看下邊的代碼:
測試代碼
#include<stdio.h>
/*
**輸出兩個(gè)×××數(shù)據(jù)的最大值
*/
int Int_Max(int a, int b )
{
return a>b?a:b;
}
/*
**輸出兩個(gè)雙精度浮點(diǎn)數(shù)的最大值
*/
double Double_Max(double a,double b)
{
return a>b?a:b;
}
/*
**定義一個(gè)指針函數(shù)
*/
int *Fun_Arry(int x, int y)
{
static int arry3[5]= {0};
int *p;
p = arry3;
return p;
}
/*
**定義兩個(gè)函數(shù)指針,用來間接操作剛才定義的兩個(gè)函數(shù)
*/
int (*function1)(int ,int );
double (*function2)(double ,double );
int main()
{
int a = 1, b = 5; //聲明兩個(gè)×××數(shù)據(jù)
double c = 3.4, d = 3.6; //聲明兩個(gè)浮點(diǎn)型數(shù)據(jù)
int arry1[5] = {0}; //聲明一個(gè)×××數(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] ; //聲明一個(gè)指針數(shù)組,用來保存×××指針
int (*arry_3)[2]; //聲明一個(gè)數(shù)組指針,指向一個(gè)數(shù)組
int (*arry_4)[5]; //聲明一個(gè)數(shù)組指針,指向一個(gè)數(shù)組
int (*arry_5)[3][3]; //聲明一個(gè)數(shù)組指針,指向一個(gè)數(shù)組
/*
**變量arry_3是一個(gè)數(shù)組指針,它指向一個(gè)包含2 個(gè)int 類型數(shù)據(jù)的數(shù)組,即數(shù)組指針
**并且只能指向有兩個(gè)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ù),因而,下邊分別讓他們分別指向了我之前定義的兩個(gè)函數(shù)。
*/
function1 = Int_Max;
function2 = Double_Max;
/*
**arry_2是一個(gè)指針數(shù)組,按照我上文說的,那它就是用來保存指針的,
**由于我在這里聲明的為×××指針數(shù)組,所以,這里我們看到保存了我個(gè)×××指針。
*/
arry_2[0] = lp1;
arry_2[1] = lp2;
arry_2[2] = lp3;
arry_2[3] = lp4;
arry_2[4] = lp5;
/*
**為了驗(yàn)證函數(shù)指針的正確性,我做了一下測試前兩行我用函數(shù)名,
**直接調(diào)用函數(shù),分別得到×××、浮點(diǎn)型的最大值。
*/
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;
}
運(yùn)行結(jié)果測試圖
測試代碼中我已經(jīng)盡可能多的給出了注釋,我在這里再重點(diǎn)提一個(gè)數(shù)組指針,數(shù)組指針就是指向數(shù)組的指針,注意看代碼中我用紅色標(biāo)注的部分,分別聲明了三個(gè)不同類型的數(shù)組指針,arry_3是一個(gè)指向兩個(gè)×××元素的數(shù)組的指針,并且對于此指針只能指向有兩個(gè)×××元素的數(shù)組,arry_4是一個(gè)指向5個(gè)×××元素?cái)?shù)組的指針ok,這也將涉及到上一篇博文遺留的一個(gè)問題,數(shù)組名到底是什么。arry_5是一個(gè)指向3行3列的二維數(shù)組的指針。ok,定義完了了我們來看后邊的賦值,arry_3是一個(gè)指向兩個(gè)×××元素的數(shù)組的指針,。然后用它接收了一個(gè)二維數(shù)組名,是不是有疑問,對于arry_3,不是應(yīng)該指向一個(gè)一維數(shù)組嗎?怎么把一個(gè)二維數(shù)組名給它了,首先我來告訴你,這是對的,我的上一篇博文是不是談到,數(shù)組名就是代表一個(gè)數(shù)組,其保存著該數(shù)組的首元素的地址,對于二維數(shù)組從存儲(chǔ)結(jié)構(gòu)上來看,首元素就是一個(gè)一維數(shù)組,所以用把二維數(shù)組名賦值給arry_3,其本質(zhì)是將一個(gè)一維數(shù)組賦并且只有兩個(gè)×××元素的數(shù)組的地址賦值給arry_3,我們接著來看,arry_4,我把一個(gè)一維數(shù)組的地址給它,這時(shí)arry_4就指向了一維數(shù)組arry1,再看最后一條,如果要操作二維數(shù)組,就要把二維數(shù)組名的地址給相同類型的數(shù)組指針。ok對于這幾個(gè)很麻煩的的概念,按照自己理解總結(jié)了一下,希望能幫到遇到同樣問題的你,最后我在總結(jié)一下今天寫的以及一些注意事項(xiàng)。
函數(shù)指針:就是指向函數(shù)的指針。
1、函數(shù)名就是函數(shù)的入口地址
2、指向函數(shù)的指針就是函數(shù)指針
使用函數(shù)指針是要達(dá)到 三同 即:1、函數(shù)返回值相同2、參數(shù)個(gè)數(shù)相同3、參數(shù)對應(yīng)的類型相同
3、其他類型的指針均可自增自減,但是對于函數(shù)指針不允許自增自減
指針數(shù)組:存儲(chǔ)指針的數(shù)組。
1、 數(shù)組中的三值合一:數(shù)組名、數(shù)組首元素地址、數(shù)組名的地址
數(shù)組名中保存首元素的地址 《 數(shù)組名取地址 代表針對整個(gè)數(shù)組取地址》
2、數(shù)組名取地址代表整個(gè)數(shù)組的地址 當(dāng)要接收數(shù)組名的地址時(shí)就要定義一個(gè)數(shù)組類型的指針
3、一維數(shù)組可以通過一級指針接收數(shù)組的地址,達(dá)到引用數(shù)組并操作數(shù)組的目的,
但是二維數(shù)組卻不能通過定義二級指針來接收數(shù)組名,達(dá)到引用并操縱數(shù)組的目的。始終注意:數(shù)組名代表整個(gè)數(shù)組,然后數(shù)組名有值保存了數(shù)組首元素的地址
4、對于二維數(shù)組,從本質(zhì)上講是一個(gè)一維數(shù)組,但是每個(gè)元素是一個(gè)數(shù)組;
數(shù)組指針:就是指向數(shù)組的指針。
指針函數(shù):返回指針的函數(shù)就是指針函數(shù)。
當(dāng)前題目:指針數(shù)組,數(shù)組指針、指針函數(shù),函數(shù)指針
網(wǎng)站URL:http://jinyejixie.com/article38/ijoppp.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供軟件開發(fā)、外貿(mào)網(wǎng)站建設(shè)、品牌網(wǎng)站設(shè)計(jì)、響應(yīng)式網(wǎng)站、做網(wǎng)站、外貿(mào)建站
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)