欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2722|回復: 0
打印 上一主題 下一主題
收起左側

嵌入式C語言的難點 函數指針和指針函數

[復制鏈接]
跳轉到指定樓層
樓主
ID:107189 發表于 2016-3-6 13:00 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
在程序運行中,函數代碼是程序的算法指令部分,它們和數組一樣也占用存儲空間,都有相應的地址。可以使用指針變量指向數組的首地址,也可以使用指針變量指向函數代碼的首地址,指向函數代碼首地址的指針變量稱為函數指針。
1.函數指針定義
函數類型 (*指針變量名)(形參列表);
“函數類型”說明函數的返回類型,由于“()”的優先級高于“*”,所以指針變量名外的括號必不可少,后面的“形參列表”表示指針變量指向的函數所帶的參數列表。
例如:
int (*f)(int x);
double (*ptr)(double x);
在定義函數指針時請注意:

函數指針和它指向的函數的參數個數和類型都應該是—致的;

函數指針的類型和函數的返回值類型也必須是一致的。
2.函數指針的賦值
函數名和數組名一樣代表了函數代碼的首地址,因此在賦值時,直接將函數指針指向函數名就行了。
例如,
int func(int x); /* 聲明一個函數 */
int (*f) (int x); /* 聲明一個函數指針 */
f=func;          /* 將func函數的首地址賦給指針f */
賦值時函數func不帶括號,也不帶參數,由于func代表函數的首地址,因此經過賦值以后,指針f就指向函數func(x)的代碼的首地址。
3.通過函數指針調用函數
函數指針是通過函數名及有關參數進行調用的。
與其他指針變量相類似,如果指針變量pi是指向某整型變量i的指針,則*p等于它所指的變量i;如果pf是指向某浮點型變量f的指針,則*pf就等價于它所指的變量f。同樣地,*f是指向函數func(x)的指針,則*f就代表它所指向的函數func。所以在執行了f=func;之后,(*f)和func代表同一函數。
由于函數指針指向存儲區中的某個函數,因此可以通過函數指針調用相應的函數,F在我們就討論如何用函數指針調用函數,它應執行下面三步:
首先,要說明函數指針變量。
例如:int (*f)(int x);
其次,要對函數指針變量賦值。
例如: f=func; (func(x)必須先要有定義)
最后,要用 (*指針變量)(參數表);調用函數。
例如: (*f)(x);(x必須先賦值)

【例】任意輸入n個數,找出其中最大數,并且輸出最大數值。
main()
{
       int f();
       int i,a,b;
       int (*p)(); /* 定義函數指針 */
       scanf('%d',&a);
       p=f;          /* 給函數指針p賦值,使它指向函數f */
       for(i=1;i<9;i++)
       {
            scanf('%d',&b);

            a=(*p)(a,b); /* 通過指針p調用函數f */
       }
       printf('The Max Number is:%d',a)
}

f(int x,int y)
{
int z;
z=(x>y)?x:y;
return(z);
}
運行結果為:
343 -45 4389 4235 1 -534 988 555 789↙
The Max Number is:4389

【例】(*((void (*)())0))() 表示什么意思?
void (*)() 聲明函數指針
       讓我們來分析一下,左邊圓括弧中的星號是函數指針聲明的關鍵。另外兩個元素是函數的返回類型(void)和右邊圓括弧中的入口參數(本例中參數是空)。注意本例中還沒有創建指針變量-只是聲明了變量類型。
(void (*)())0   把0強制轉換成函數指針
(*((void (*)())0))()   調用

所以(*((void (*)())0))()的意思是:調用地址為0處的程序。


【指針函數】

一個函數不僅可以帶回一個整型數據的值,字符類型值和實型類型的值,還可以帶回指針類型的數據,使其指向某個地址單元。
       返回指針的函數,一般定義格式為:
       類型標識符 *函數名(參數表)
int *f(x,y);
其中x,y是形式參數,f是函數名,調用后返回一個指向整型數據的地址指針。f(x,y)是函數,其值是指針。
如:char *ch();表示的就是一個返回字符型指針的函數,請看下面的例題:
【例】將字符串1(str1)復制到字符串2(str2),并輸出字符串2.
#include 'stdio.h'
main()
{
char *ch(char *,char *);
char str1[]='I am glad to meet you!';
char str2[]='Welcom to study C!';
printf('%s',ch(str1,str2));
}
char *ch(char *str1,char *str2)
{
int i;
char *p;
p=str2

if(*str2==NULL) exit(-1);

do
{
       *str2=*str1;
       str1++;
       str2++;
}while(*str1!=NULL);
return(p);
}

通過分析可得
函數指針是一個指向函數的指針,而指針函數只是說明他是一個返回值為指針的函數,
函數指針可以用來指向一個函數。
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表