看板 C_and_CPP 關於我們 聯絡資訊
※ 引述《monkey12 (猴仔)》之銘言: : 開發平台(Platform): (Ex: VC++, GCC, Linux, ...) : VC++ : 問題(Question): : char str[] = "Love"; : char* p = str; : printf("%c", *p++); : 我查了一下++高於*(dereference) : 那這樣 結果不是應該是o嗎? : 先指標往前移一個位置 : 然後在指向資料內容?? : 但實際執行結果是L?? : 感謝大家 以下內容僅供參考, 畢竟我跟你一樣都只是 baby programmer 記住以下兩個原則: (1) 有問題時, printf() 永遠是你的好朋友 (2) 想到什麼寫什麼, 有必要再化簡 你原本的問題是: a. 先讓指標往前移一個位置 b. 再印出指標指向的資料內容 中文明明是兩句, 你為什麼要把它寫成一行程式碼呢? p = p + 1; // a. printf( "%c", *p ); // b. 不明白原理時, 要想到原則(1), 每行都印出你有改到值的變數, 為了對照, 改前改後都印: printf( "%p", (void*)p ); // 印出加之前的指標值 p = p + 1; printf( "%p", (void*)p ); // 印出加之後的指標值 printf( "%c", *p ); // 因為沒改到值就不用印 在我電腦上的執行結果如下: 0022ff47 0022ff48 o 最後真的印出字元'o'! 所以回去把紫色底的程式碼刪除, 這段程 式基本上就完成了. 你如果覺得 p = p + 1 太長想改寫也是可以, 不過先確定有達成 一樣的效果: printf( "%p", (void*)p ); // 印出加之前的指標值 p++; printf( "%p", (void*)p ); // 印出加之後的指標值 printf( "%c", *p ); 這段執行結果是: 0022ff47 0022ff48 o ok這次改寫沒問題, 當你又想把黃底的部份用 p++ 替換掉, 一樣 先確定值是你想要的: printf( "%p", (void*)p ); // 印出加之前的指標值 char *q = p++; printf( "%p", (void*)p ); // 印出加之後的指標值 printf( "%p", (void*)q ); // 這邊加印指標q的值 printf( "%c", *q ); 執行結果: 0022ff47 0022ff48 0022ff47 o 很明顯在印字元之前 q 的數值已經跟前幾次數值不一樣, 結果有 落差是理所當然的. p++; printf( "%c", *p ); 這樣已經是最好的寫法, 符合你的敘述又不需考慮優先權, 我覺得 與其背那些還不如留點腦容量去想怎麼賺更多錢! 至於: while(*dest++ = *src++); 這樣字串複製的程式碼我一直看不懂也不想看懂, 因為那只有卓越 的 programmer 才會用的術語. -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 140.121.197.115
james732:我現在才發現這個帳號是版主... 11/10 05:05
tropical72:推 :) ( 我都不敢擢破這件事,最後還是被擢破了 ) 11/10 05:31
james732:啊,不該說的嗎? 11/10 07:07
purpose:暱稱都一樣呀 11/10 07:08
monkey12:感謝您詳細的介紹 十分感謝!!! 11/10 11:07
diabloevagto:我都沒發現說(筆記) 話說用dbg的工具也滿好用的 11/10 11:21
x000032001:文章中看到很多顏色就大概可以猜出來是... 11/10 12:18
jason12308:最後一段話是何意? 11/10 21:34
x000032001:就是簡化到有點病態啦 11/10 21:34
angleevil:難怪最近覺得版主消失了 11/10 21:36
xatier:之前看到暱稱和 ip 就想說... 11/10 22:04
tomnelson:嗯,很棒!可我還是還寫那"while(*d++=*s++);"東西出來,因 11/10 22:14
tomnelson:為我知道compiler看得懂... Orz 11/10 22:14
xatier:while (*d++=*s++); 不是 K&R 裡最經典的範例嗎XD 11/10 22:22
xatier:不過真的不建議寫就是了...萬一有人把 = 改成 == 就噴了 11/10 22:23
VictorTom:小弟我還沒發現這是板主....XD 11/10 23:40
tomnelson:我還沒拜讀該本經典,只是原po中變數命名太長,所以就變成 11/12 12:25
tomnelson:d和s了! 真的在程式中,用原po的dest與src命名是比較被建 11/12 12:26
tomnelson:議的,因為這樣人家比較能夠快速看出這簡短的程式在幹啥. 11/12 12:27
tomnelson:(畢竟編出來的machine不會因為命名不同而不同!) 11/12 12:28