⑴ c語言中函數名就是一個指針嗎
是的。函數指針就是函數的指針,它是一個指針,指向一個函數。這正如用指針變數可指向整型變數、字元型、數組侍譽改一樣,這里是指向函數。
例:
A) char * (*fun1)(char * p1,char * p2);
B) char * *fun2(char * p1,char * p2);
表達式相虛州比,唯一不同老判的就是函數的返回值類型為char**,是個二級指針。
C) char * fun3(char * p1,char * p2);
fun3是函數名,p1,p2是參數,其類型為char *型,函數的返回值為char *類型。
(1)函數名編譯後是不是一個地址擴展閱讀
函數指針使用的例子
#include <stdio.h>
#include <string.h>
char * fun(char * p1,char * p2)
{
int i = 0;
i = strcmp(p1,p2);
if (0 == i)
{
return p1;
}
else
{
return p2;
}
}
int main()
{
char * (*pf)(char * p1,char * p2);
pf = &fun;
(*pf) ("aa","bb");
return 0;
}
⑵ c語言中函數得到數組不是一個地址嗎
如果是把數組作為參數傳入,那麼得到的是一個地悉運茄址。
或者悄鍵更准確的說,得到的是一個指睜察針。
在C語言中,很多情況下指針和數組是可以通用的。
⑶ c語言中, 函數名也稱為函數的指針,那函數名是否也占內存空間
ShowMenu是一個函脊族譽數名,可以看到他的值是一個地址。
&ShowMenu是對函數取地址櫻段,指向和ShowMenu同樣的地址。
可以看出,ShowMenu是佔用一穗衡個位元組的,而作為指針&ShowMenu卻佔用四個位元組。
所以說,函數名佔用空間的。
⑷ c語言函數入口地址是第一個形參地址嗎
是。在C語言中,一此伏個函數的函數名其實就是一個地址,即該函數的坦頃入口地址。我們可以聲明一個函數指針,並將函數的入口地址(函森信攜數名)賦值給這個指針,然後使用這個指針來調用具體的函數。
⑸ C語言中,函數名代表函數的入口地址嗎!!!求大神!求解析
要知道main函數也是由其他的程序調用的。
我們編寫的程序,最終是不存在所謂的函隱返談數名的,有的只有內存單元地址0xffeedd00.
我們的程序執行時,程序載入到內存,比方說整個程序所佔用的內存范圍是0xffee0000 ~ 0xffeedd00,這么多灶碰。
假設程序有一個小函數fun(),那麼它的范圍可能是0xffee0000~0xffee00ff。
那麼函數fun()的入口地址是多少? 0xffee0000。。
那麼函數名世兄fun實際上就是0xffee0000的別稱。
你用一個指針指向這個函數,那麼你把 指針 = 函數名,實際就是把0xffee0000這個內存單元的地址給指針p。
所以,結論是:
函數名 是 程序在執行時, 函數所佔內存單元塊的 首地址 的別稱。
⑹ c語言中函數名就是一個指針嗎
是的。c語言中, 函數名也稱為函數的指針,所以c語言中函數名就是一個指針。
「函數指針」本身首先應是指針變數,只不過該指針變數指向函數。這正如用指針變數可指向整型變數、字元型、數組一樣,這里是指向函數顫凳。
如前所述,C在編譯時,每一個函數都有一個入口地址,該入口地址就是函數指針所指向的地址。有了指向函數的指針變數後。
可用該指針變數調用函數,就如同用指針變數可引用其他類型變數一樣,在這些概念上是大體一致的。函數指針有兩個用途:調用函數和做函數的參數。
如果一個變數聲明時在前面使用 * 號,表明這是個指針型變數。換句話說,該變數存儲一個地址,而 *(此處特指單目運算符 * ,下同。C語言中另有 雙目運算符 *) 則是取內容操作符,意思是槐悔取這個內存地址里存儲的內容。指針是 C 語言區別於其他同時代高級語言的主要特徵之一。
指針不僅可以是變數的地址,還可以是數組、數組元素、函數的地址。通過指針作為形式參數可以在函數的調用過程得到一個以上的返回值,不同於return(z)這樣茄明旅的僅能得到一個返回值。
指針是一把雙刃劍,許多操作可以通過指針自然的表達,但是不正確的或者過分的使用指針又會給程序帶來大量潛在的錯誤。
⑺ C語言中函數名不是代表函數存儲單元的首地址嗎為什麼*函數名=函數名
感覺你說的是 「指向函數侍李的指針變數」
可以定義一個 函數指針變數,然後將一個函數名賦值給這個函數指針變數。
很多函數 是把一個函數指針 作為 參數來傳遞的。
舉例:
int c,d;
int (*p)(int a,int b); //聲明一個函數指針類型的變數,變數名為p,其類型是 int *(int a,int 老姿遲 //b)
int func1( int a,int b);//聲明一個函數1
int func2(int f,int g);//聲明一個函數2
p=func1; //將一個函數名賦值給一個函數指針變數
c=(*P)(34,69); //使用指針調用函數fun1
p=func2;
d=(*p)(50,90); //使用函數指針 調用函數func2
其它細節這里就不詳細解答了,希望我的回答對你冊基有點幫助,很高興和你一起討論和學習。
⑻ c語言中函數名就是地址嗎
函數名在主函數里是個介面或者叫入口,你神握悶可以通游彎過定義一個指皮納針來指向他
void * p;
int fun(int a);
p=fun;
⑼ 如何理解c語言中「一切都是地址」
C語言用變數來存儲數據,用函數來定義一段可以重復使用的代碼,它們最終都要放到內存中才能供 CPU 使用。
數據和代碼都以二進制的形式存儲在內存中,計算機無法從格式上區分某塊內存到底存儲的是數據還是代碼。當程序被載入到內存前敬凳後,操作系統會給不同的內存塊指定不同的許可權,擁有讀取和執行許可權的內存塊就是代碼,而擁有讀取和寫入許可權(也可能只有讀取許可權)的內存塊就是數據。
CPU 只能通過地址來取得內存中的代碼和數據,程序在執行過程中會告知 CPU 要執行的代碼以及要讀寫的數據的地址。如果程序不小心出錯,或者開發者有意為之,在 CPU 要寫入數據時給它一個代碼區域的地址,就會發生內存訪問錯誤。這種內存訪問錯誤會被硬體和操作系統攔截,強製程序崩潰,程序員沒有挽救的機會。
CPU 訪問內存時需要的是地址,而不是變數名和函數名!變數名和函數名只是地址的一種助記符,當源文件被編譯和鏈接成可執行程序後,它們都會被替換成地址。編譯和鏈接過程的一項重要任務就是找到這些名稱所對應的地址。
假設變數稿世 a、b、c 在內存中的地址分別是 0X1000、0X2000、0X3000,那麼加法運算c = a + b;將會被轉換成類似下面的形式:
0X3000 = (0X1000) + (0X2000);
( )表示取值操作,整個表達式的意思是,取出地址 0X1000 和 0X2000 上的值,將它們相加,把相加的結果賦值給地址為 0X3000 的內存
變數名和函數名為我們提供了方便,讓我們在編寫代碼的過程中可以使用易於閱讀和理解的英文字元串,不用直接面對二進制地址,那場景簡直讓人崩潰。
需要慧旅注意的是,雖然變數名、函數名、字元串名和數組名在本質上是一樣的,它們都是地址的助記符,但在編寫代碼的過程中,我們認為變數名表示的是數據本身,而函數名、字元串名和數組名表示的是代碼塊或數據塊的首地址。
⑽ C語言中,函數名代表函數的入口地址嗎!!!求大神!求解析!
再學習函數指針的時候,見過這么一個例子差渣迅:
int func(int x); /* 聲明一個函數 */
void (*f) (int x); /* 聲明一個函數指針 */
f=func; /* 將func函數的首地址賦給指針f */
賦值時函數func不帶括弧,也不帶參數,由於func代表函數的首地址,因此經過賦值以後,指針f就指向函數func(x)的代碼的首地址。
所以 函虛此數名代梁頌表函數的入口地址吧