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

iosc語言函數指針的指針的指針

發布時間: 2023-08-18 22:56:54

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語言中函數指針用法

函數在內存中有一個物理位置,而這個位置是可以賦給一個指針的。一零點函數的地址就是該函數的入口點。因此,函數指針可被用來調用一個函數。函數的地址是用不帶任何括弧或參數的函數名來得到的。(這很類似於數組地址的得到方法,即,在只有數組名而無下標是就得到數組地址。)

怎樣說明一個函數指針變數呢 ?

為了說明一個變數 fn_pointer 的類型是"返回值為 int 的函數指針", 你可以使用下面的說明語句:

int (*fn_pointer) ();

為了讓編譯器能正確地解釋這句語句, *fn_pointer 必須用括弧圍起來。若漏了這對括弧, 則:

int *fn_pointer ();

的意思完全不同了。fn_pointer 將是一個函數名, 其返回值為 int 類型的指針。

2:函數指針變數

在C語言中規定,一個函數總是佔用一段連續的內存區, 而函數名就是該函數所佔內存區的首地址。 我們可以把函數的這個首地址 ( 或稱入口地址 ) 賦予一個指針變數, 使該指針變數指向該函數。然後通過指針變數就可以找到並調用這個函數。我們把這種指向函數的指針變數稱為 " 函數指針變數 " 。

函數指針變數定義的一般形式為:

類型說明符 (* 指針變數名 )();

其中 " 類型說明符 " 表示被指函數的返回值的類型。 "(* 指針變數名 )" 表示 "*" 後面的變數是定義的指針變數。 最後的空括弧表示指針變數所指的是一個函數。

例如: int (*pf)();

表示 pf 是一個指向函數入口的指針變數,該函數的返回值 ( 函數值 ) 是整型。

下面通過例子來說明用指針形式實現對函數調用的方法。

int max(int a,int b)

{

if(a>b)return a;

else return b;

}

main()

{

int max(int a,int b);

int(*pmax)();

int x,y,z;

pmax=max;

printf("input two numbers:/n");

scanf("%d%d",&x,&y);

z=(*pmax)(x,y);

printf("maxmum=%d",z);

}

從上述程序可以看出用,函數指針變數形式調用函數的步驟如下:

1>. 先定義函數指針變數,如後一程序中第 9 行 int (*pmax)(); 定義 pmax 為函數指針變數。

2>. 把被調函數的入口地址 ( 函數名 ) 賦予該函數指針變數,如程序中第 11 行 pmax=max;

3>. 用函數指針變數形式調用函數,如程序第 14 行 z=(*pmax)(x,y); 調用函數的一般形式為: (* 指針變數名 ) ( 實參表 ) 使用函數指針變數還應注意以下兩點:

a. 函數指針變數不能進行算術運算,這是與數組指針變數不同的。數組指針變數加減一個整數可使指針移動指向後面或前面的數組元素,而函數指針的移動是毫無意義的。

b. 函數調用中 "(* 指針變數名 )" 的兩邊的括弧不可少,其中的 * 不應該理解為求值運算,在此處它只是一種表示符號。

3:指針型函數

前面我們介紹過,所謂函數類型是指函數返回值的類型。 在C語言中允許一個函數的返回值是一個指針 ( 即地址 ) ,這種返回指針值的函數稱為指針型函數。

定義指針型函數的一般形式為:

類型說明符 * 函數名 ( 形參表 )

{

…… /* 函數體 */

}

其中函數名之前加了 "*" 號表明這是一個指針型函數,即返回值是一個指針。類型說明符表示了返回的指針值所指向的數據類型。

如:

int *ap(int x,int y)

{

…… /* 函數體 */

}

表示 ap 是一個返回指針值的指針型函數, 它返回的指針指向一個整型變數。下例中定義了一個指針型函數 day_name ,它的返回值指向一個字元串。該函數中定義了一個靜態指針數組 name 。 name 數組初始化賦值為八個字元串,分別表示各個星期名及出錯提示。形參 n 表示與星期名所對應的整數。在主函數中, 把輸入的整數 i 作為實參, 在 printf 語句中調用 day_name 函數並把 i 值傳送給形參 n 。 day_name 函數中的 return 語句包含一個條件表達式, n 值若大於 7 或小於 1 則把 name[0] 指針返回主函數輸出出錯提示字元串 "Illegal day" 。否則返回主函數輸出對應的星期名。主函數中的第 7 行是個條件語句,其語義是,如輸入為負數 (i<0) 則中止程序運行退出程序。 exit 是一個庫函數, exit(1) 表示發生錯誤後退出程序, exit(0) 表示正常退出。

應該特別注意的是函數指針變數和指針型函數這兩者在寫法和意義上的區別。如 int(*p)() 和 int *p() 是兩個完全不同的量。 int(*p)() 是一個變數說明,說明 p 是一個指向函數入口的指針變數,該函數的返回值是整型量, (*p) 的兩邊的括弧不能少。

int *p() 則不是變數說明而是函數說明,說明 p 是一個指針型函數,其返回值是一個指向整型量的指針,*p 兩邊沒有括弧。作為函數說明, 在括弧內最好寫入形式參數,這樣便於與變數說明區別。 對於指針型函數定義,int *p() 只是函數頭部分,一般還應該有函數體部分。

main()

{

int i;

char *day_name(int n);

printf("input Day No:/n");

scanf("%d",&i);

if(i<0) exit(1);

printf("Day No:%2d-->%s/n",i,day_name(i));

}

char *day_n

ame(int n)

{

static char *name[]={ "Illegal day",

"Monday",

"Tuesday",

"Wednesday",

"Thursday",

"Friday",

"Saturday",

"Sunday"};

return((n<1||n>7) ? name[0] : name[n]);

}

本程序是通過指針函數,輸入一個 1 ~ 7 之間的整數, 輸出對應的星期名。指針數組的說明與使用一個數組的元素值為指針則是指針數組。指針數組是一組有序的指針的集合。指針數組的所有元素都必須是具有相同存儲類型和指向相同數據類型的指針變數。

指針數組說明的一般形式為: 類型說明符 * 數組名 [ 數組長度 ]

其中類型說明符為指針值所指向的變數的類型。例如: int *pa[3] 表示 pa 是一個指針數組,它有三個數組元素, 每個元素值都是一個指針,指向整型變數。通常可用一個指針數組來指向一個二維數組。 指針數組中的每個元素被賦予二維數組每一行的首地址,因此也可理解為指向一個一維數組。圖 6—6 表示了這種關系。

int a[3][3]={1,2,3,4,5,6,7,8,9};

int *pa[3]={a[0],a[1],a[2]};

int *p=a[0];

main()

{

int i;

for(i=0;i<3;i++)

printf("%d,%d,%d/n",a[i][2-i],*a[i],*(*(a+i)+i));

for(i=0;i<3;i++)

printf("%d,%d,%d/n",*pa[i],p[i],*(p+i));

}

本常式序中, pa 是一個指針數組,三個元素分別指向二維數組 a 的各行。然後用循環語句輸出指定的數組元素。其中 *a[i] 表示 i 行 0 列元素值; *(*(a+i)+i) 表示 i 行 i 列的元素值; *pa[i] 表示 i 行 0 列元素值;由於 p 與 a[0] 相同,故 p[i] 表示 0 行 i 列的值; *(p+i) 表示 0 行 i 列的值。讀者可仔細領會元素值的各種不同的表示方法。 應該注意指針數組和二維數組指針變數的區別。 這兩者雖然都可用來表示二維數組,但是其表示方法和意義是不同的

⑶ 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);
};

以上這幾種用法都摘自我自己的項目,請參考。

熱點內容
蘋果耳塞怎麼改安卓也能用 發布:2025-02-05 14:50:54 瀏覽:557
安卓如何鑒別手機真假 發布:2025-02-05 14:28:15 瀏覽:119
ffmpeglinux編譯 發布:2025-02-05 14:28:04 瀏覽:544
伺服器如何做界面 發布:2025-02-05 14:27:23 瀏覽:290
訪問學者單位推薦意見 發布:2025-02-05 14:13:05 瀏覽:853
微信密碼鎖忘了怎麼辦 發布:2025-02-05 14:11:07 瀏覽:311
web是什麼文件夾 發布:2025-02-05 14:11:05 瀏覽:235
對信訪問題調查 發布:2025-02-05 14:09:39 瀏覽:984
singlephp 發布:2025-02-05 14:09:24 瀏覽:774
資料庫的欄位命名規則 發布:2025-02-05 13:53:16 瀏覽:684