Re: [問題] 問一題面試的題目...

看板C_and_CPP作者 (北方小路)時間15年前 (2010/02/04 07:22), 編輯推噓15(15022)
留言37則, 13人參與, 最新討論串2/4 (看更多)
改: int main (void) { int *a, *b; a = 1; b = 1; printf("%d\n", a-b); return 0; } ※ 引述《HPMC (如果)》之銘言: : void main(void) : { : int*a,*b; : a=1; : b=1; : printf("%d\n",a+b); : } : 這是一題有關指標的題目 : 請問哪裡有錯?? : 面試官問我這題...讓我當場掛黑板...看來我C要重修了.. : 我一直看前面三行...他跟我說問題出在最後一行... : 可是我到現在還找不到答案...希望有人幫我解答...謝謝 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 60.251.196.22

02/04 15:32, , 1F
剛還在想指標-指標會怎樣, 才想到就是算offset嘛....Orz
02/04 15:32, 1F

02/04 15:54, , 2F
真聰明,但這是他要的答案?
02/04 15:54, 2F

02/04 17:05, , 3F
指標相減是offset= =?;那請問一下 為什麼指標相加不是
02/04 17:05, 3F

02/04 17:06, , 4F
offset>_<; 有誰可以解惑一下 冏 謝謝
02/04 17:06, 4F

02/04 17:16, , 5F
沒得解釋。因為規格就是定「同類型指標相減,得offset」
02/04 17:16, 5F

02/04 17:18, , 6F
兩個指標 a-b = ((int)a - (int)b) / sizeof(int)
02/04 17:18, 6F

02/04 17:22, , 7F
我也被陰到了 XD
02/04 17:22, 7F

02/04 17:25, , 8F
樓樓上的算試不太對
02/04 17:25, 8F

02/04 17:48, , 9F
blexx 的算式中,sizeof(int) 應改成 sizeof(*a)
02/04 17:48, 9F

02/04 17:49, , 10F
當然 a 和 b 必需是同樣 type 的 pointer
02/04 17:49, 10F

02/04 18:03, , 11F
位址1 + ? => 位址2. 所以 位址2 - 位址1 => ? (offset)
02/04 18:03, 11F

02/04 18:04, , 12F
那 位址相加 你覺得可以得到什麼 .... @_@"
02/04 18:04, 12F

02/04 18:14, , 13F
得到一個 Warning
02/04 18:14, 13F

02/04 19:22, , 14F
啊!打太順手就錯了XD
02/04 19:22, 14F

02/04 19:31, , 15F
sizeof(*a) 傳回的型別為 unsigned int,所以這部分應該
02/04 19:31, 15F

02/04 19:32, , 16F
打成(int)(sizeof(*a))吧@@~ 剛剛試過了,原本的有問題呢
02/04 19:32, 16F

02/04 20:11, , 17F
看到二個位址相加,最初的印象是最好能解釋為位址+偏移->位址
02/04 20:11, 17F

02/04 20:11, , 18F
但顯然C/C++沒那麼先進.
02/04 20:11, 18F

02/04 20:13, , 19F
你覺得偏移該怎麼訂..
02/04 20:13, 19F

02/04 20:16, , 20F
m+n,如果m是位址,n就是不過份的數字,而m+n就是另一個位址.
02/04 20:16, 20F

02/04 20:16, , 21F
此時n可以自動轉型為整數...
02/04 20:16, 21F

02/04 20:21, , 22F
指標n轉成int有任何意義嗎?
02/04 20:21, 22F

02/04 20:23, , 23F
就ptr-ptr=int ptr+int=ptr ptr+ptr會有error
02/04 20:23, 23F

02/04 20:24, , 24F
以前遇過.. 看很久看不出原因 當時是因為要讀mmap
02/04 20:24, 24F

02/04 20:24, , 25F
裡面的東西就直接加上mmap的起點(也是指標)
02/04 20:24, 25F

02/04 20:25, , 26F
然後裡面的struct也是寫指標 然後就炸了 轉個型就好
02/04 20:25, 26F

02/04 20:26, , 27F
順便推一下uintptr_t
02/04 20:26, 27F

02/04 20:28, , 28F
用的是gcc version 4.2.1 20070719 [FreeBSD]
02/04 20:28, 28F

02/04 21:01, , 29F
意義是看在程式沒出錯的情況下,對人來說有沒有意義.
02/04 21:01, 29F

02/04 21:02, , 30F
許多語言規則本來就沒保證一定都做有意義的事情.
02/04 21:02, 30F

02/04 21:04, , 31F
不過我感覺有些愛好type checking的人準備要罵我了.
02/04 21:04, 31F

02/04 21:06, , 32F
我只是想說.. 你把0xDEADBEEF這種東西加在一起根本沒用啊
02/04 21:06, 32F

02/04 21:11, , 33F
的確是啦,不過既然你知道加起來沒用,就不會寫那種程式了.
02/04 21:11, 33F

02/04 21:11, , 34F
對位址加法的功能來說,沒差啊
02/04 21:11, 34F

02/04 22:48, , 35F
我覺得好的語言, 有好的語義也很重要, 不能只看結果對不對
02/04 22:48, 35F

02/04 22:49, , 36F
如果容許亂寫都沒關係, 像 PHP 那樣... 那很可能會寫出難以
02/04 22:49, 36F

02/04 22:49, , 37F
看懂的程式
02/04 22:49, 37F
文章代碼(AID): #1BQdM_B9 (C_and_CPP)
文章代碼(AID): #1BQdM_B9 (C_and_CPP)