Re: [問題] 函數指標

看板C_and_CPP作者 (purpose)時間9年前 (2015/03/22 21:02), 編輯推噓1(104)
留言5則, 3人參與, 最新討論串3/4 (看更多)
: : 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 會自動轉型, 變成「函數指標」這種資料型態。 -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 124.8.132.117 ※ 文章網址: https://www.ptt.cc/bbs/C_and_CPP/M.1427029369.A.E26.html

03/22 21:09, , 1F
推推,對於陣列名稱部分可以很容易看懂,函數部分雖然大概
03/22 21:09, 1F

03/22 21:10, , 2F
知道想講什麼,但是還是很模糊的感覺XD
03/22 21:10, 2F

03/22 21:14, , 3F
從標準的角度來看, 這些講法不盡正確. C 跟 C++ 也不盡相同
03/22 21:14, 3F

03/23 00:10, , 4F
感謝p大回覆 你的說法可以接受 但F大又說不一定正確@@?
03/23 00:10, 4F

03/23 00:12, , 5F
可以請F大賜教嗎? 或給個方向或哪些書 非常感激
03/23 00:12, 5F
文章代碼(AID): #1L3hrvuc (C_and_CPP)
討論串 (同標題文章)
本文引述了以下文章的的內容:
以下文章回應了本文
完整討論串 (本文為第 3 之 4 篇):
文章代碼(AID): #1L3hrvuc (C_and_CPP)