Re: [問題] 函數指標

作者: purpose (秀才遇到肥宅兵)   2015-03-22 21:02:43
: : fptr=max; //fptr=&max;
: 1. 自動轉型! 請問是什麼type自動轉型成什麼type?
: 想法:
: max 自動轉型成pointer
: 也就是說compiler 做了fptr=(int(*)(int,int))max;
現在假設你正在觀看一份原始碼...
那麼 1234 是什麼?
一個「literal」,一筆資料,不確定資料型態,預設值好像是當成 int。
所以 (int *) 1234 是什麼?
把 literal 做型態轉換 (type conversion),而且是
顯式的型態轉換 (explicit conversion),也就是做 cast 這個動作,使得
1234 的資料型態,必然是一種 (int *)。
那 (int *) 是什麼?
代表該資料是指標的其中一種。
那指標是什麼?
從佔用的記憶體空間來看,指標是一種在 32-bit 機器佔用 4 bytes,
在 64-bit 機器佔用 8 bytes 的資料型態。
從 + 1 這件事來看,如果是 int 就是單純遞增一個單位,可是指標的 + 1
會遞增多少單位,要看是指向的東西是什麼型態。比如 (double *) 做 + 1
就是遞增八個單位。
從白冰冰的角度來看,指標他不是好人,不是壞人,他根本不是人。
所以,它不是一種變數 (variable),不是一種常數 (cosntant),也不是
一種常值 (literal),而根本是一種 type。
※ 變數跟常數,會用 symbol 表示,比如用英文單字 bar;
常值不使用 symobl 表示,直接將資料寫入原始碼,比如 3.14。
引述 C++ Primer 的解釋:
A pointer is a compound type that “points to” another type.
陣列名稱是不是指標?
這是一個對很多人來說討論到爛的問題,但我需要重提一次,以便跟函數對比。
編譯器,對於陣列名稱的認定,會看當時的使用情景。
九成以上的狀況當然是...
把陣列的起始位址取出來,然後轉換資料型態,變成一種指標。
如果碰到少數情形,比如配合 sizeof 運算子時,上面那種轉成指標的轉型
就不會進行,而是會考慮整個陣列的大小有多大,再傳回結果。
函數名稱是不是指標?
如果從陣列的情況來推論,函數名稱也應該要視使用情景來決定。
但我不知道什麼情況是特例,也許有,也許沒有
我個人都是無腦的認定函數名稱 == 函數起始位址。
在這種情況下,該不該把函數認定成資料的一種?還是說函數是函數,
資料歸資料?
函數沒有資料型態?資料型態裡面也沒有函數?
假設資料型態裡沒有函數,那麼函數名稱的處理是...編譯器透過函數名稱,
創造出一筆資料,其型態為函數指標。因此回答原 PO... max 沒有被自動轉型。
假設資料型態裡面有「函數」這種型態,那麼 max 的原始型態是函數,
當 max 作為變數初始化、賦值運算的運算元時,則 max 會自動轉型,
變成「函數指標」這種資料型態。
作者: wenyonba (射後不理很XX啊!!!!)   2015-03-22 21:09:00
推推,對於陣列名稱部分可以很容易看懂,函數部分雖然大概知道想講什麼,但是還是很模糊的感覺XD
作者: Feis (永遠睡不著 @@)   2015-03-22 21:14:00
從標準的角度來看, 這些講法不盡正確. C 跟 C++ 也不盡相同
作者: jono103 (不說對不起)   2015-03-23 00:10:00
感謝p大回覆 你的說法可以接受 但F大又說不一定正確@@?可以請F大賜教嗎? 或給個方向或哪些書 非常感激

Links booklink

Contact Us: admin [ a t ] ucptt.com