為什麼在Code::Blocks中getchar等於4204520?

#include

main()

{

printf("%d",getchar);

//注意,不是"getchar()"

}

使用的編譯器是GNU GCC Compiler,運行後列印出的結果是4204520。

這個問題是在一次拼寫錯誤後被我發現的。我了解getchar()函數的用法,但是getchar看起來並不像是一個函數;如果將getchar理解成變數的話也有問題,我之前沒有申明過啊。莫非它是某個神秘的關鍵字?


你列印的是getchar的函數地址。

函數地址也是有一個具體的值的,同樣的,可以列印出任何一個標準庫函數的地址比如:

printf("%d", fopen);

函數的聲明在stdio.h里,從你的代碼上看,你是include了這個的。


高票答案沒有回答到點子上

在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等等,然後你也許就明白了


不是函數是什麼?函數是不是也有個位置來存放?


推薦閱讀:

Hadoop的一些基本命令使用

TAG:編程 | C編程語言 | Code::Blocks |