#include stdio.h
建網站原本是網站策劃師、網絡程序員、網頁設計師等,應用各種網絡程序開發(fā)技術和網頁設計技術配合操作的協同工作。創(chuàng)新互聯專業(yè)提供網站設計、網站建設,網頁設計,網站制作(企業(yè)站、自適應網站建設、電商門戶網站)等服務,從網站深度策劃、搜索引擎友好度優(yōu)化到用戶體驗的提升,我們力求做到極致!
void f()
{
}
void main()
{
printf("%u\n", f);
printf("%u\n", f);
printf("%p\n", f);
}
主函數中前兩行%u表示輸出無符號的十進制,而第三行%p表示輸出地址,其結果是一個十六進制的數,你將其轉換成十進制,你會發(fā)現與前兩行結果一樣。
函數名本身是一個地址,其實 C 語言的指針就代表一個地址的,雖然指針本身也有地址
函數的地址是在代碼空間中,在編譯時就分配好了。
代碼空間就是系統中存放你寫的代碼的地方,不同的行地址當然就不一樣咯
1、函數直接返回一個指針類型即返回地址。
2、C語言屬于高級編程語言。在C語言中一個函數不能返回局部地址即指針。
例:
int * func(void)
{
int a= 10;
int *p = a;
return p;
}
a變量的區(qū)域是func()函數,在函數內有效,出了函數就釋放了,此時p指向的是一個未知
地址,屬于錯誤用法。
正確用法:
int *p = NULL;
int * func(void)
{
p = malloc(sizeof(int));
if(p!=NULL)
{
*p = 10;
}
return p;
}
要知道m(xù)ain函數也是由其他的程序調用的。
我們編寫的程序,最終是不存在所謂的函數名的,有的只有內存單元地址0xffeedd00.
我們的程序執(zhí)行時,程序加載到內存,比方說整個程序所占用的內存范圍是0xffee0000 ~ 0xffeedd00,這么多。
假設程序有一個小函數fun(),那么它的范圍可能是0xffee0000~0xffee00ff。
那么函數fun()的入口地址是多少? 0xffee0000。。
那么函數名fun實際上就是0xffee0000的別稱。
你用一個指針指向這個函數,那么你把 指針 = 函數名,實際就是把0xffee0000這個內存單元的地址給指針p。
所以,結論是:
函數名 是 程序在執(zhí)行時, 函數所占內存單元塊的 首地址 的別稱。