要知道m(xù)ain函數(shù)也是由其他的程序調(diào)用的。
創(chuàng)新互聯(lián)公司專注于青秀企業(yè)網(wǎng)站建設,成都響應式網(wǎng)站建設,電子商務商城網(wǎng)站建設。青秀網(wǎng)站建設公司,為青秀等地區(qū)提供建站服務。全流程按需制作網(wǎng)站,專業(yè)設計,全程項目跟蹤,創(chuàng)新互聯(lián)公司專業(yè)和態(tài)度為您提供的服務
我們編寫的程序,最終是不存在所謂的函數(shù)名的,有的只有內(nèi)存單元地址0xffeedd00.
我們的程序執(zhí)行時,程序加載到內(nèi)存,比方說整個程序所占用的內(nèi)存范圍是0xffee0000 ~ 0xffeedd00,這么多。
假設程序有一個小函數(shù)fun(),那么它的范圍可能是0xffee0000~0xffee00ff。
那么函數(shù)fun()的入口地址是多少? 0xffee0000。。
那么函數(shù)名fun實際上就是0xffee0000的別稱。
你用一個指針指向這個函數(shù),那么你把 指針 = 函數(shù)名,實際就是把0xffee0000這個內(nèi)存單元的地址給指針p。
所以,結論是:
函數(shù)名 是 程序在執(zhí)行時, 函數(shù)所占內(nèi)存單元塊的 首地址 的別稱。
#include stdio.h
void f()
{
}
void main()
{
printf("%u\n", f);
printf("%u\n", f);
printf("%p\n", f);
}
主函數(shù)中前兩行%u表示輸出無符號的十進制,而第三行%p表示輸出地址,其結果是一個十六進制的數(shù),你將其轉換成十進制,你會發(fā)現(xiàn)與前兩行結果一樣。
C語言中,所有的變量都存儲在內(nèi)存中,可以通過運算符獲得變量的內(nèi)存地址,函數(shù)調(diào)用時,只需要把普通變量前加上符號,就可以達到傳遞變量地址的目的。例如:定義一個結構體類型structYearmonthday{intyear,month,day;};定義相關函數(shù)
是。在C語言中,一個函數(shù)的函數(shù)名其實就是一個地址,即該函數(shù)的入口地址。我們可以聲明一個函數(shù)指針,并將函數(shù)的入口地址(函數(shù)名)賦值給這個指針,然后使用這個指針來調(diào)用具體的函數(shù)。
再學習函數(shù)指針的時候,見過這么一個例子:
int func(int x); /* 聲明一個函數(shù) */
void (*f) (int x); /* 聲明一個函數(shù)指針 */
f=func; /* 將func函數(shù)的首地址賦給指針f */
賦值時函數(shù)func不帶括號,也不帶參數(shù),由于func代表函數(shù)的首地址,因此經(jīng)過賦值以后,指針f就指向函數(shù)func(x)的代碼的首地址。
所以 函數(shù)名代表函數(shù)的入口地址吧
1、獲得函數(shù)的地址
函數(shù)名實際上就是指針,所以可以通過強制類型轉換來獲取函數(shù)的地址。
int i = 0;
i = (int)main;
printf(“%d\n”,i);
這樣我們就獲取了main函數(shù)的地址了,其他的自定義的函數(shù)也是同樣的道理啊。
2、獲取變量地址
int variab = 0;
int addrvar = 0;
addrvar = (int)variab;
在變量addrvar中保存了變量variab的地址。
3、獲得數(shù)組的地址
數(shù)組本身就是指針,它本身就是內(nèi)存地址,和獲得函數(shù)地址的方法一樣啊。比如
int array[10];
int addrarr;
addrarr = (int)array;