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