[指針函數(shù)與函數(shù)指針的區(qū)別]
【函數(shù)指針】
在程序運行中棋枕,函數(shù)代碼是程序的算法指令部分,它們和數(shù)組一樣也占用存儲空間券册,都有相應(yīng)的地址〖⑶郑可以使用指針變量指向數(shù)組的首地址,也可以使用指針變量指向函數(shù)代碼的首地址衣屏,指向函數(shù)代碼首地址的指針變量稱為函數(shù)指針躏升。
1.函數(shù)指針定義
函數(shù)類型 (*指針變量名)(形參列表);
“函數(shù)類型”說明函數(shù)的返回類型狼忱,由于“()”的優(yōu)先級高于“*”,所以指針變量名外的括號必不可少膨疏,后面的“形參列表”表示指針變量指向的函數(shù)所帶的參數(shù)列表。
例如:
int (*f)(int x);
double (*ptr)(double x);
在定義函數(shù)指針時請注意:
函數(shù)指針和它指向的函數(shù)的參數(shù)個數(shù)和類型都應(yīng)該是—致的钻弄;
函數(shù)指針的類型和函數(shù)的返回值類型也必須是一致的佃却。
2.函數(shù)指針的賦值
函數(shù)名和數(shù)組名一樣代表了函數(shù)代碼的首地址,因此在賦值時窘俺,直接將函數(shù)指針指向函數(shù)名就行了饲帅。
例如,
int func(int x); /* 聲明一個函數(shù) */
int (*f) (int x); /* 聲明一個函數(shù)指針 */
f=func; /* 將func函數(shù)的首地址賦給指針f */
賦值時函數(shù)func不帶括號瘤泪,也不帶參數(shù)灶泵,由于func代表函數(shù)的首地址,因此經(jīng)過賦值以后均芽,指針f就指向函數(shù)func(x)的代碼的首地址丘逸。
3.通過函數(shù)指針調(diào)用函數(shù)
函數(shù)指針是通過函數(shù)名及有關(guān)參數(shù)進行調(diào)用的。
與其他指針變量相類似掀宋,如果指針變量pi是指向某整型變量i的指針深纲,則p等于它所指的變量i;如果pf是指向某浮點型變量f的指針劲妙,則pf就等價于它所指的變量f湃鹊。同樣地,f是指向函數(shù)func(x)的指針镣奋,則f就代表它所指向的函數(shù)func币呵。所以在執(zhí)行了f=func;之后,(*f)和func代表同一函數(shù)侨颈。
由于函數(shù)指針指向存儲區(qū)中的某個函數(shù)余赢,因此可以通過函數(shù)指針調(diào)用相應(yīng)的函數(shù)。現(xiàn)在我們就討論如何用函數(shù)指針調(diào)用函數(shù)哈垢,它應(yīng)執(zhí)行下面三步:
首先妻柒,要說明函數(shù)指針變量。
例如:int (*f)(int x);
其次耘分,要對函數(shù)指針變量賦值举塔。
例如: f=func; (func(x)必須先要有定義)
最后绑警,要用 (*指針變量)(參數(shù)表);調(diào)用函數(shù)。
例如: (*f)(x);(x必須先賦值)
【例】任意輸入n個數(shù)央渣,找出其中最大數(shù)计盒,并且輸出最大數(shù)值。
main()
{
int f();
int i芽丹,a北启,b;
int (*p)(); /* 定義函數(shù)指針 */
scanf("%d",&a);
p=f; /* 給函數(shù)指針p賦值志衍,使它指向函數(shù)f */
for(i=1;i<9;i++)
{
scanf("%d"暖庄,&b);
a=(*p)(a聊替,b); /* 通過指針p調(diào)用函數(shù)f */
}
printf("The Max Number is:%d"楼肪,a)
}
f(int x,int y)
{
int z;
z=(x>y)?x:y;
return(z);
}
運行結(jié)果為:
343 -45 4389 4235 1 -534 988 555 789↙
The Max Number is:4389
【指針函數(shù)】
一個函數(shù)不僅可以帶回一個整型數(shù)據(jù)的值惹悄,字符類型值和實型類型的值春叫,還可以帶回指針類型的數(shù)據(jù),使其指向某個地址單元泣港。
返回指針的函數(shù)暂殖,一般定義格式為:
類型標(biāo)識符 *函數(shù)名(參數(shù)表)
int *f(x,y);
其中x当纱,y是形式參數(shù)呛每,f是函數(shù)名,調(diào)用后返回一個指向整型數(shù)據(jù)的地址指針坡氯。f(x晨横,y)是函數(shù),其值是指針箫柳。
如:char *ch();表示的就是一個返回字符型指針的函數(shù)手形,請看下面的例題:
【例】將字符串1(str1)復(fù)制到字符串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);
}
通過分析可得
函數(shù)指針是一個指向函數(shù)的指針瞬欧,而指針函數(shù)只是說明他是一個返回值為指針的函數(shù)
函數(shù)指針可以用來指向一個函數(shù)。
路由器和交換器的區(qū)別
- 交換器實現(xiàn)了多臺設(shè)備通過一根網(wǎng)線上網(wǎng)罢防,并且各自之間沒有影響艘虎,各自撥號,一臺設(shè)備上網(wǎng)不會影響其他設(shè)備的網(wǎng)速篙梢。設(shè)備在同一個局域網(wǎng)中顷帖。
- 路由器同時具備交換和撥號的功能美旧。路由器上了解的設(shè)備也在一個局域網(wǎng)中,但是互相之間是有影響的贬墩,一臺設(shè)備上網(wǎng)會導(dǎo)致其它設(shè)備網(wǎng)速變慢榴嗅。
- 高端路由器:高端路由器是指在Internet骨干網(wǎng)核心使用、性能優(yōu)良陶舞、具有高密度高速端口和巨大交換容量的新一代路由器產(chǎn)品.通常將背板交換能力大于40Gbits的路由器稱為高端路由器,背板交換能力40Gbits以下的路由器稱為中低端路由器.
二分查找
定義
二分查找又稱折半查找嗽测,優(yōu)點是比較次數(shù)少,查找速度快肿孵,平均性能好;其缺點是要求待查表為有序表唠粥,且插入刪除困難。因此停做,折半查找方法適用于不經(jīng)常變動而查找頻繁的有序列表晤愧。首先,假設(shè)表中元素是按升序排列蛉腌,將表中間位置記錄的關(guān)鍵字與查找關(guān)鍵字比較官份,如果兩者相等,則查找成功;否則利用中間位置記錄將表分成前烙丛、后兩個子表舅巷,如果中間位置記錄的關(guān)鍵字大于查找關(guān)鍵字,則進一步查找前一子表河咽,否則進一步查找后一子表钠右。重復(fù)以上過程,直到找到滿足條件的記錄忘蟹,使查找成功飒房,或直到子表不存在為止,此時查找不成功寒瓦。遞歸方法
int BinSearch(int Array[],int low,int high,int key/*要找的值*/)
{
if (low<=high)
{
int mid = (low+high)/2;
if(key == Array[mid])
return mid;
else if(key<Array[mid])
return BinSearch(Array,low,mid-1,key);
else if(key>Array[mid])
return BinSearch(Array,mid+1,high,key);
}
else
return -1;
}
- 非遞歸方法
int BinSearch(int Array[],int SizeOfArray,int key/*要找的值*/)
{
int low=0,high=SizeOfArray-1;
int mid;
while (low<=high)
{
mid = (low+high)/2;
if(key==Array[mid])
return mid;
if(key<Array[mid])
high=mid-1;
if(key>Array[mid])
low=mid+1;
}
return -1;
}
static
面向過程
- 靜態(tài)全局變量:
該變量在全局?jǐn)?shù)據(jù)區(qū)分配內(nèi)存情屹;靜態(tài)全局變量在聲明它的整個文件都是可見
的,而在文件之外是不可見的杂腰。靜態(tài)變量都在全局?jǐn)?shù)據(jù)區(qū)分配內(nèi)存垃你,包括后面將要提到的靜態(tài)局部變量也是。
定義靜態(tài)全局變量還有以下好處:
靜態(tài)全局變量不能被其它文件所用喂很;其它文件中可以定義相同名字的變量惜颇,不會發(fā)生沖突。
注意:全局變量和全局靜態(tài)變量的區(qū)別
- 全局變量是不顯式用static 修飾的全局變量少辣,全局變量默認(rèn)是有外部鏈接性凌摄,作用域是整個工程,在一個文件內(nèi)定義的全局變量漓帅,在另一個文件中锨亏,通過extern 全局變量名的聲明痴怨,就可以使用全局變量。
- 全局靜態(tài)變量是顯式用static 修飾的全局變量器予,作用域是聲明此變量所在的文件浪藻,其他的文件即使用extern 聲明也不能使用。
- 靜態(tài)局部變量
靜態(tài)局部變量有以下特點:
該變量在全局?jǐn)?shù)據(jù)區(qū)分配內(nèi)存乾翔;靜態(tài)局部變量在程序執(zhí)行到該對象的聲明處時被首次初始化爱葵,即以后的函數(shù)調(diào)用不再進行初始化;它始終駐留在全局?jǐn)?shù)據(jù)區(qū)反浓,直到程序運行結(jié)束萌丈。但其作用域為局部作用域,當(dāng)定義它的函數(shù)或
語句塊結(jié)束時雷则,其作用域隨之結(jié)束辆雾。 - 靜態(tài)函數(shù):
靜態(tài)函數(shù)與普通函數(shù)不同,它只能在聲明它的文件當(dāng)中可見巧婶,不能被其它文件使用乾颁。定義靜態(tài)函數(shù)的好處:靜態(tài)函數(shù)不能被其它文件所用涂乌;其它文件中可以定義相同名字的函數(shù)艺栈,不會發(fā)生沖突。
面向?qū)ο螅愔械膕tatic 關(guān)鍵字)
靜態(tài)數(shù)據(jù)成員
靜態(tài)數(shù)據(jù)成員有以下特點:
對于非靜態(tài)數(shù)據(jù)成員湾盒,每個類對象都有自己的拷貝湿右。而靜態(tài)數(shù)據(jù)成員被當(dāng)作是類的成員。無論這個類的對象被定義了多少個罚勾,靜態(tài)數(shù)據(jù)成員在程序中也只有一份拷貝毅人,由該類型的所有對象共享訪問。同全局變量相比尖殃,使用靜態(tài)數(shù)據(jù)成員有兩個優(yōu)勢:靜態(tài)數(shù)據(jù)成員沒有進入程序的全局名字空間丈莺,因此不存在與程序中其它全局名字沖突的可能性;
可以實現(xiàn)信息隱藏送丰。靜態(tài)數(shù)據(jù)成員可以是private 成員缔俄,而全局變量不能;靜態(tài)成員之間可以相互訪問器躏,包括靜態(tài)成員函數(shù)訪問靜態(tài)數(shù)據(jù)成員和訪問靜態(tài)成員函數(shù)俐载;非靜態(tài)成員函數(shù)可以任意地訪問靜態(tài)成員函數(shù)
調(diào)用類的靜態(tài)成員函數(shù)。作用static 靜態(tài)變量聲明符登失。在聲明它的程序塊遏佣,子程序塊或函數(shù)內(nèi)部有效,值保持揽浙,在整個程序期間分配存儲器空間状婶,編譯器默認(rèn)值0意敛。為什么要引入static
函數(shù)內(nèi)部定義的變量,在程序執(zhí)行到它的定義處時膛虫,編譯器為它在棧上分配空間空闲,大家知道,函數(shù)在棧上分配的空間在此函數(shù)執(zhí)行結(jié)束時會釋放掉走敌,這樣就產(chǎn)生了一個問題: 如果想將函數(shù)中此變量的值保存至下一次調(diào)用時碴倾,如何實現(xiàn)? 最容易想到的方法是定義一個全局的變量掉丽,但定義為一個全局變量有許多缺點跌榔,最明顯的缺點是破壞了此變量的訪問范圍(使得在此函數(shù)中定義的變量,不僅僅受此函數(shù)控制)捶障。