當前位置:首頁 » 編程語言 » c語言函數指針變數

c語言函數指針變數

發布時間: 2023-02-01 11:36:48

c語言指針變數定義

根據你的定義,使用LinkList定義的變數是指針變數,而加上*即LinkList *C表示的是指向指針的指針,表示二級指針變數。

你的合並函數是一個沒有返回值的函數,所以你在函數體內更改C要達到更改實參的效果,你必須傳入實參的地址。

如果是一級指針,C接收實參指向的對象地址,如果此時在函數體內對C進行賦值,只是改變了函數體內C的指向,實參還是指向原來的地址。函數內是改變不了實參C本身的指向,只有傳入實參C變數本身的地址,那麼形參就要定義指向指針的變數來接收實參。

以上是一種方法,另外一種方法就是通過函數返回值,返回新合並的鏈表的頭。那函數類型就可以改為:

LinkList MergeList(LinkList a, LinkList b)。

這可以多練習好好理解一下。

⑵ c語言 指針作為函數變數怎麼用

#include <stdio.h>

void exe(int** p, int** q);

void main()

{


int *p, *q, a, b;


scanf("%d %d", &a, &b);

p = &a;

q = &b;

if (a < b)

{

exe(&p, &q);

}

printf("a=%d,b=%d ", a, b);

printf("max=%d,min=%d ", *p, *q);

}


void exe(int** p, int** q)

{

int* t;

t = *p;

*p = *q;

*q = t;

}

⑶ 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語言指針基本概念及其指針變數的定義是什麼

語言中,指針是一種類型,被稱為「指針類型」。指針類型描述的是一個地址,這個地址指向內存中另外一個對象的位置。簡單地說,指針表示的是它所指向對象的地址。

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 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) 定義函數指針變數的時候,函數返回數據類型和形參列表必須與要指向函數的定義一致;

⑺ C語言中的函數指針

函數指針是定義一個指向函數的指針,形式為:void (*p)(void);
一般用法:
int fun1(int x);
int fun2(int x);
char fun3(int x);
int fun4(char x);
int main(void)
{
int (*p)(int x);
p=fun1; //指向fun1
p(2) //這時等價於fun1(2)
p=fun2; //也可以指向fun2


但是注意了,p=fun3;和p=fun4都是錯誤的,參數類型跟返回類型必須一樣。

至於指針函數,就是返回一個指針的函數。
基本形式:int *fun(void);
一般用法:
int *fun(void);
int main(void)
{
int *p=NULL; //聲明一個整型指針變數
p=fun(); //接收fun()的返回值

⑻ C語言指針變數的賦值和做函數的參數

1、指針變數的賦值,分為定義時賦值(初始化)和單獨賦值,如:
int x ;
int * px=&x ; //定義時賦值,也稱初始化,注意這里的*是跟隨int的,即變數px是int *類型變數! 實際上的賦值語句是px=&x ;
int * py ;
py=&x ; //單獨賦值,將py指向x
*py=10 ; //這里的*,是引用指針中的數據操作符,*跟隨的變數必須是指針類型變數,否則會出錯! *py就是x,這里相當於x=10;
2、指針變數作為函數的參數時,子函數可以通過指針引用實參地址中的數據,達到修改實參地址中的數據。如:
#include <stdio.h>
void func( int a, int b, int *pmax )
{
if ( a>b ) *pmax=a;
else *pmax=b ;
}
void main()
{
int a=2,b=3,max=0;
func(a,b,&max ); //這里將變數max的地址傳遞到子函數,子函數中通過該地址,可以修改max的值,達到子函數結束後,max能帶回運算結果的效果。
printf("max=%d\n", max );
}

熱點內容
解壓到當前文件夾右鍵 發布:2024-04-26 03:57:08 瀏覽:979
html5android教程視頻下載 發布:2024-04-26 03:09:59 瀏覽:867
伺服器的描述是什麼 發布:2024-04-26 03:08:32 瀏覽:394
個人加密 發布:2024-04-26 03:01:23 瀏覽:521
linuxusbgadget 發布:2024-04-26 02:52:54 瀏覽:304
我的世界空島世界伺服器地址 發布:2024-04-26 01:39:08 瀏覽:248
尼爾機械紀元加密 發布:2024-04-26 01:37:11 瀏覽:868
在控制台輸出sql語句 發布:2024-04-26 01:08:12 瀏覽:432
動畫java 發布:2024-04-26 01:02:40 瀏覽:12
得力文件夾5302 發布:2024-04-26 00:21:32 瀏覽:91