為什麼在Code::Blocks中getchar等於4204520?
01-29
#include
main() { printf("%d",getchar); //注意,不是"getchar()"}
使用的編譯器是GNU GCC Compiler,運行後列印出的結果是4204520。這個問題是在一次拼寫錯誤後被我發現的。我了解getchar()函數的用法,但是getchar看起來並不像是一個函數;如果將getchar理解成變數的話也有問題,我之前沒有申明過啊。莫非它是某個神秘的關鍵字?
你列印的是getchar的函數地址。
函數地址也是有一個具體的值的,同樣的,可以列印出任何一個標準庫函數的地址比如:
printf("%d", fopen);
高票答案沒有回答到點子上在C語言中 函數名默認就是函數的地址
如 getchat 類型為int * (void)
而您printf出的 便是getchar的函數地址呵呵噠,題主腦洞大開了,c語言所有函數作為變數都是相當於函數指針,輸出的就是個地址,所以應該用%p,,,至於聲明,裡面聲明定義函數就是聲明了這個變數,,,
函數地址啊
這是c程序的內存分布。
高地址
===========
棧區
堆區
全局變數區
常量區
代碼區 〈=看這裡
===========
低地址void fun(int arg){
//略
}
我們都知道:
1. fun();這個是函數調用。
2. printf("%d",fun);會列印fun的地址。其實,這個fun函數代碼會存放在內存里,代碼區。而fun相當於這個函數代碼的「家門口「,也就是函數的首地址。你問,為什麼在Code::Blocks中getchar等於4204520?
回答:
getchar表示的是地址,而計算機里地址是用數字表示的。為什麼是4204520?這個數字有什麼規律么?有的。代碼段是存放在低地址的。雖然他數字看起來很大, 但其實並不大,反正是小於其他地址的,生活在社會底層永世不得翻身。( ̄▽ ̄)"
所以如果你用printf列印,必然能列印出一串數字,表示地址。
除了這個,你再試試看用printf列印putchar的地址。
以及,int a; printf("%d",a); //列印這個變數的地址。看看是不是比getchar的地址大。==============分割線================
我們再來試試看
void (*p)(int)// 定義一個指針,這個指針可以指向fun這個函數p = fun; //fun賦予了地址
p(); //以後這樣就能調用fun函數了。
其實fun這個也可以被當成指針。
當然還是有區別的,因為存儲的位置不一樣。指針作為臨時變數是存放在棧區的。如果你哪天精力充沛,可以好好了解下c程序的內存分布。感受一下地址的概念。
了解每個區域會放哪些東西。還有,函數指針的基本用法。如果c語言語法還沒學完,那可以先放放,先把語法都搞定,少糾結內部原理。你可以試試在那裡填寫各種你知道的函數的名稱printf,scanf,main等等,然後你也許就明白了
不是函數是什麼?函數是不是也有個位置來存放?
推薦閱讀:
TAG:編程 | C編程語言 | Code::Blocks |