[問題] 函式指標一問

看板C_and_CPP (C/C++)作者 (是黑是白)時間15年前 (2011/02/20 20:53), 編輯推噓8(8023)
留言31則, 8人參與, 最新討論串1/1
開發平台(Platform): (Ex: VC++, GCC, Linux, ...) Dev C++ 問題(Question): 找資料的時候看到講義上寫說: 函式本身是一個"指向函式的pointer",並指向自身函式的開頭 但是把書上面的範例打進去 跑出的結果卻跟上面的說法不一致 程式碼(Code): #include<iostream> using namespace std; int max(int a,int b) { return(a>b?a:b); } int main() { int(*pmax)(int,int); pmax = max; cout<<(*pmax)(2,3); cout<<pmax(2,3); cout<<max(2,3); cout<<*max(2,3); //←這行過不了,如果如上面所說,應該可以通過才是? system("pause"); return 0; } 麻煩各位解惑了,感謝!! -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 140.116.243.66

02/20 20:56, , 1F
這樣能過的話 max(2,3)就不會過啦
02/20 20:56, 1F

02/20 20:56, , 2F
會變成 cout << *3; 然後違法存取記憶體位址3
02/20 20:56, 2F

02/20 20:56, , 3F
你看的講義很有問題
02/20 20:56, 3F

02/20 21:02, , 4F
但改成(*max)(2,3)一樣不行 問題好多XD
02/20 21:02, 4F

02/20 21:05, , 5F
所以講義上說的那句(黃色標示)是錯的嗎@@?
02/20 21:05, 5F

02/20 21:09, , 6F
不...錯的是藍色那一行 max(2,3)是呼叫函式
02/20 21:09, 6F

02/20 21:10, , 7F
整個代表就是一個int的值 (回傳int)
02/20 21:10, 7F

02/20 21:10, , 8F
compiler會把這樣的使用方法看做呼叫
02/20 21:10, 8F

02/20 21:14, , 9F
函數就是函數,雖然無限接近一個記憶體位址,但不等同。
02/20 21:14, 9F

02/20 21:14, , 10F
所以你要的是這個: cout<<(*max)(2,3); 先對max取*
02/20 21:14, 10F

02/20 21:14, , 11F
再說,一般狀況下,指標是一個存放記憶體位址的變數。
02/20 21:14, 11F

02/20 21:18, , 12F
不要寫無聊的測試來考編譯器了
02/20 21:18, 12F

02/20 21:33, , 13F
樓上XD 只是很好奇啦 之前沒學好想說仔細念一下這樣
02/20 21:33, 13F

02/20 21:35, , 14F
an大 cout<<(*max)(2,3);一樣不給過... error資訊↓
02/20 21:35, 14F

02/20 21:36, , 15F
overloaded function with no contextual type information
02/20 21:36, 15F

02/20 21:37, , 16F
另外感謝p大 受教了!
02/20 21:37, 16F

02/20 21:40, , 17F
我測了一下 用c++的header不能過 stdio.h 跟printf吧
02/20 21:40, 17F

02/20 21:56, , 18F
..................................................
02/20 21:56, 18F

02/20 22:18, , 19F
這個max應該會跟內建的std::max有衝突?
02/20 22:18, 19F

02/20 22:23, , 20F
樓上正解! (沒想到...Orz)
02/20 22:23, 20F
感謝annheilong大!!終於知道error出在哪了~

02/20 23:23, , 21F
沒想過函式也可以這樣*, 乍看之下還真像普通array與
02/20 23:23, 21F

02/20 23:24, , 22F
&array / *array ^[]
02/20 23:24, 22F

02/20 23:25, , 23F
的關係@_@" // 怎麼一直漏字Orz
02/20 23:25, 23F

02/20 23:30, , 24F
cout << max << 就可以了.. XD
02/20 23:30, 24F

02/20 23:31, , 25F
其實原po的理解沒錯,當寫出max的瞬間,他就會decay成指標
02/20 23:31, 25F

02/20 23:32, , 26F
只是你要印的話,根本不用加上後面的參數串列
02/20 23:32, 26F

02/20 23:32, , 27F
單給函數名稱就可以了,雖說印出來也沒用什麼,但確實可以印
02/20 23:32, 27F

02/20 23:32, , 28F
也不盡然沒用,有的時候你可以inject code去印函數名稱
02/20 23:32, 28F

02/20 23:33, , 29F
再配合緩衝區液位攻擊改寫程式碼..
02/20 23:33, 29F

02/20 23:34, , 30F
講錯了 函數位置 不是名稱.. 且也不是這樣印...
02/20 23:34, 30F
y大講得好深XD ※ 編輯: bwtalk 來自: 140.116.243.66 (02/22 18:01)

11/09 22:36, , 31F
我愛美君
11/09 22:36, 31F
文章代碼(AID): #1DOGwtOo (C_and_CPP)
文章代碼(AID): #1DOGwtOo (C_and_CPP)