c語言的函數指針定義
㈠ c語言函數指針定義
函數指針就是函數的指針。它是一個指針,指向一個函數。看例子: A) char * (*fun1)(char * p1,char * p2); B) char * *fun2(char * p1,char * p2); C) char * fun3(char * p1,char * p2); 看看上面三個表達式分別是什麼意思? C):這很容易,fun3 是函數名,p1,p2 是參數,其類型為char *型,函數的返回值為char *類型。 B):也很簡單,與C)表達式相比,唯一不同的就是函數的返回值類型為char**,是個二級指針。 A):fun1 是函數名嗎?回憶一下前面講解數組指針時的情形。我們說數組指針這么定義或許更清晰: int (*)[10] p; 再看看A)表達式與這里何其相似!明白了吧。這里fun1 不是什麼函數名,而是一個指針變數,它指向一個函數。這個函數有兩個指針類型的參數,函數的返回值也是一個指針。同樣,我們把這個表達式改寫一下:char * (*)(char * p1,char * p2) fun1;
㈡ 論述C語言中指針的概念和作用,並舉例說明
1、指針概念:變數的地址(計算機內存位元組的編號)叫做指針,存放變數地址的變數叫指針變
量,
簡言之,指針是用來存放地址的。
2、作用:指向這個變數或數組的首地址,是變數的間接引用方式。其值如果改變,變數的值或數組元素的值也會跟著改變。程序對變數的操作實際上是對變數所在的存儲空間讀取和寫入數據。方便對變數的操作。
舉例說明:
int
a=3;/*定義一個整型變數a,並賦初值3*/
int
*p;/*定義一個指針變數P*/
p=&a;/*讓p指向a的首地址,也就是a的地址*/
程序為a分配一個2個位元組的存儲單元,假如2個位元組的地址分別為(ABCD1和ABCD2,唯一),那麼p裡面放的值就是ABCD1,不是3。這時可通過p直接引用a,實際上*p=3。以後不管a存放在內存中的哪個地方,只用通過調用p就可以引用a。這時如果令*p=4,則最後的a值也為4。對於數組,指針是指向數組的首地址。
㈢ C語言指針基本概念及其指針變數的定義是什麼
指針是常見間接訪問方式.指針就像一個快捷方式,它指向內存的一個地址,可以通過指針就可以間接的訪問到數據。對於計算機,訪問內存的方式有兩種,直接訪問和間接訪問。直接訪問通過就是通過變數名稱去訪問。指針概念是構成C/C++的重要元素之一,是變數的一種類型,存放的是指定類型數據的地址,而同類型變數存放的是數據。
指針變數:就是一個變數,其值是可變的,與整形變數、浮點變數等等的命名規則完全相同。 「指針」是概念,「指針變數」是具體實現。指針類型說明,即定義變數為一個指針變數; 指針變數名; 變數值(指針)所指向的變數的數據類型。

(3)c語言的函數指針定義擴展閱讀:
與其他高級編程語言相比,C 語言可以更高效地對計算機硬體進行操作,而計算機硬體的操作指令,在很大程度上依賴於地址。指針提供了對地址操作的一種方法,因此,使用指針可使得 C 語言能夠更高效地實現對計算機底層硬體的操作。另外,通過指針可以更便捷地操作數組。在一定意義上可以說,指針是 C 語言的精髓。
㈣ c語言中函數指針是什麼 有什麼用 舉個實例
函數指針指函數的入口地址,作用就是跳轉。比如設置回調函數,線程函數、結構體中的成員函數等。
回調:
typedefvoid(WINAPI*USBCALLBACK)(bool,bool);//回調函數
……
USBCALLBACKpCallBack;
voidSetCallBack(USBCALLBACKUSBCallBack)//回調,指定設備接入或拔出
{
pCallBack=USBCallBack;
}
線程
DWORDWINAPIDataHandleThread(LPVOIDlParam)//處理數據線程
{
//TODO:
}
……
m_hDataHandle=CreateThread(NULL,0,DataHandleThread,this,0,NULL);//啟動線程
結構體
typedefstructLUNARHANDLE
{
bool(*GetLunar)(intiYear,intiMonth,intiDay,LUNARDATE*lunardate);
};
以上這幾種用法都摘自我自己的項目,請參考。
㈤ C語言指針變數定義
根據你的定義,使用LinkList定義的變數是指針變數,而加上*即LinkList *C表示的是指向指針的指針,表示二級指針變數。
你的合並函數是一個沒有返回值的函數,所以你在函數體內更改C要達到更改實參的效果,你必須傳入實參的地址。
如果是一級指針,C接收實參指向的對象地址,如果此時在函數體內對C進行賦值,只是改變了函數體內C的指向,實參還是指向原來的地址。函數內是改變不了實參C本身的指向,只有傳入實參C變數本身的地址,那麼形參就要定義指向指針的變數來接收實參。
以上是一種方法,另外一種方法就是通過函數返回值,返回新合並的鏈表的頭。那函數類型就可以改為:
LinkList MergeList(LinkList a, LinkList b)。

這可以多練習好好理解一下。
㈥ C語言指針基本概念及其指針變數的定義是什麼
在C語言里,指針是一組內存的頭地址,可以存一個數,一個字元,也可以是一個數組.
變數,就是像定義一個整型變數一樣的,定義的是一個指針型變數.
㈦ C語言指針基本概念及其指針變數的定義是什麼
語言中,指針是一種類型,被稱為「指針類型」。指針類型描述的是一個地址,這個地址指向內存中另外一個對象的位置。簡單地說,指針表示的是它所指向對象的地址。
1、比較point,*point,&point三者的區別
對於int * point;
point:是指針變數,其內容是地址量。
*point:是指針變數的目標變數,即指針指向的那個變數,其內容是數據。
&point:是指指針變數本身所佔據的存儲地址。
2、指針與數組
用指針和數組名在訪問內存中的數據時,他們的表現形式是等價的,因為他們都是地址量。
數組名表示整個數組的首地址,可以看作是固定地址的指針,不能被賦值。
數組名無須賦初值,而指針在使用前必須賦初值。
3、字元指針和字元串
字元串是一個字元數組,字元串以『\0』結束。printf函數的%s格式輸出字元時,是從給定的地址開始,到遇上第一個『\0』字元時結束。
對字元指針初始化,是將字元串的首地址賦給指針。
4、指針型函數
所謂指針型函數,即返回值是指針(地址)的函數。
5、多級指針
指向指針的指針(**p)就是二級指針,指向指針的指針的指針(***p)是3級指針。
多級指針類似於間接定址。
6、指向函數的指針
C語言中的函數名表示函數的首地址,即函數執行的人口地址。
定義形式:[存儲類型][數據類型標示符](*指向函數的指針變數名)();
例子: int(*fun)();//指向函數的指針 , int * fun(); //指針型函數,注意(* fun)括弧不能少
7、動態指針
當需要一大片內存的時候,最好使用動態分配。
使用malloc函數:void * malloc(size_t size)。
例子:
int * pn=malloc(10*sizeof(int));
double *pd=malloc(10*sizeof(double));
㈧ c語言如何定義一個指向指針函數的函數指針
void*f(int);//一個指針函數f
void*(*p)(int)=f;//一個指向f的函數指針p
㈨ C語言-函數指針
/*
函數指針,關鍵是後面兩個字「指針」,顧名思義,是一個指向函數的指針
原理:函數在創建好了後,函數的代碼會在內存中佔有個位置,這時我們創造一個指針來指向這個地址,這個指針就叫函數指針
函數指針不可以移動,想要移動指針的位置來指向函數的下一個指令的想法是錯誤的
函數指針的要求,
1,首先這個指針,要和函數的返回類型一樣
2,指針的*和名字,要用小括弧括起來//不括起來就是指針函數了,意思就變成,函數返回一個指針了
3,最右邊的小括弧里形參位置的類型,形參的個數,也要和函數定義時的形參一致,只要類型,不要形參名即可,
但是加上形參名也可以,沒毛病,看上去也更清晰
*/
#include
void swapchar(char *a, char *b)
{
char t;
t = *a;
*a = *b;
*b = t;
}
void swapchar2(char * a2, char * b2)
{
printf("this is swapchar2");
}
int main(void)
{
char chf = 'a', chg = 'j';
void(*p)(char * a, char * b);//定義函數指針、形參名字a、b可有可無,但有的話看上去更清晰,只要函數定義的類型、參數類型、以及參數個數,與這個指針一致,那麼這個指針p,就可以指向它
p = swapchar;//p指針接管swapchar函數,只要給函數名字,就可以給過去了
printf("chf=%c,chg=%c ", chf, chg);
p(&chf, &chg);
printf("chf=%c,chg=%c ", chf, chg);
p = swapchar2;//這里把swapchar2函數的地址,給了p,這時p從swapchar地址,轉移到了swapchar2這里。
p(&chf,&chg);
return 0;
}
㈩ C語言函數指針,敲黑白,講重點,如何定義函數指針
學習了數組之後,我們知道數組是在內存中申請一塊內存空間;數組名代表內存塊的首地址,通過數組名可以訪問內存塊中的數據。
那麼,對於函數,它也是存放在內存塊中的一段數據。例如下面的函數:
void func( int a )
{
printf( "in func, a = %d " , a );
}
此時,定義了一個函數名是func的函數。可以如下調用該函數:
func(100);
此時,就進入了func函數的函數體中執行。可以看到, 函數名如同數組名一樣,代表函數所在內存塊的首地址 。通過數組名可以訪問數組在內存塊中申請的內存,同理,通過函數名,可以訪問函數在內存中存放的數據。
所以,函數名就代表了該函數在內存塊中存放的首地址。那麼,函數名是表示一個地址,就可以把這個地址值存放在某一個指針變數中,然後,通過指針變數訪問函數名指向的函數。
在C語言中,提供了函數指針變數,可以存放函數名表示的地址。函數指針變數的定義格式如下:
返回數據類型 (*函數指針變數名)(形參列表)
對比函數的定義如下:
返回數據類型 函數名(形參列表)
可以看到,函數指針變數的定義,與函數的定義格式基本一樣,唯一的區別是把「函數名」轉換為「*(函數指針變數名)」;總結如下:
(1) 使用指針降級運算符*來定義,表示這個是一個指針。
(2) 指針降級運算符*不可以靠近返回數據類型,例如「返回數據類*」就表示函數的返回類型是一個指針。那麼,為了讓指針降級運算符*能夠修飾函數指針變數,就用小括弧()把指針降級運算符*與函數指針變數名包含起來。
定義了函數指針變數之後,可以把函數名賦給函數指針變數。因為,函數名就表示函數在內存塊中的首地址,所以,可以直接把一個地址賦值給函數指針變數。格式如下:
函數指針變數 = 函數名;
最終,可以通過函數指針變數調用函數,調用的格式與通過函數名調用完全一樣,通過函數指針變數調用函數,有如下形式:
方法1:函數指針變數(實參列表);
方法2:(*函數指針變數名)(實參列表);
很多情況下,我們更傾向於使用第一種形式,因為,它的使用方式更接近於通過函數名調用函數。
下面根據程序測試例子來看看怎麼樣應用函數指針變數。
深入學習,可以交個朋友,工人人人號:韋凱峰linux編程學堂
程序運行結果如下:
深入學習,可以交個朋友,工人人人號:韋凱峰linux編程學堂
可以看到,我們定義了func函數和函數指針變數pfunc,然後,把函數名func設置給函數指針變數pfunc,最終,通過函數指針變數pfunc調用函數。
因為函數指針變數存放的就是函數名表示的地址,所以,函數指針變數與函數名一樣,可以直接通過函數指針變數調用函數。
注意:我們在學習指針的時候,可以把一個int類型的變數地址賦值給int類型的指針;但是,不可以把int類型變數的地址,賦值給double類型的指針。這就是變數數據類型不一致的問題。
同樣的道理,定義函數的時候,函數的返回數據類型和形參列表都不一樣,所以,函數指針變數能夠接收的函數名,它們定義的 函數返回數據類型和形參列表必須一致 ,此時,就如同變數與指針變數類型一致時,才可以把變數的地址賦值給指針變數一樣。
如下是一個測試例子:
深入學習,可以交個朋友,工人人人號:韋凱峰linux編程學堂
程序編譯結果如下:
深入學習,可以交個朋友,工人人人號:韋凱峰linux編程學堂
可以看到,我們把func函數的形參列表修改為double,但是,函數指針變數pfunc定義的形參列表為int類型,此時,函數和函數指針變數的定義格式不一致,所以,不可以把函數名表示的地址設置給函數指針變數。我們來總結一下:
(1) 在Ubuntu系統中,使用GCC編譯,提示warning警告,但是,程序可以編譯通過,可以運行。
(2) 在Windows系統中,使用Visual Studio工具,無法編譯該代碼,提示類型不一致。
(3) 從代碼的嚴謹方面來說,是不可以設置類型不一致的數據。所以,我們應該編寫嚴謹的代碼,函數定義的類型,與函數指針類型不一致的時候,不可以把函數名,賦值給函數指針變數。
函數指針變數的定義很重要,我們需要牢記和理解它們使用的方式。下面多舉幾個例子說明函數指針變數的定義和使用。
int func( void );
int (*pfunc)( void );
pfunc = func;
此時,定義func函數,它的返回值類型是int類型,形參列表是void,那麼,定義pfunc函數指針變數的時候,它的返回值類型與形參列表都必須與func一樣。
char * func1( int x, int y, int x);
char * (*pfunc1)( int , int , int );
pfunc1 = func1;
char * (*pfunc1)( int x, int y, int x);
我們再總結一下:
(1) 函數名表示函數在內存塊中的首地址,可以直接把函數名賦值給函數指針變數;
(2) 定義函數指針變數的時候,函數返回數據類型和形參列表必須與要指向函數的定義一致;
