[分享] 雙重指標小應用- 看板C_and_CPP

文章推薦指數: 80 %
投票人數:10人

剛剛在指導學長使用雙重指標,將心得分享上來如果今天已經預先將值放在程式碼內,而不用fopen去讀檔該怎麼做#include #include //預先放置之副程式. 批踢踢實業坊 › 看板C_and_CPP 關於我們 聯絡資訊 返回看板 作者jacky1989(幻想的夢境)看板C_and_CPP標題[分享]雙重指標小應用時間TueDec221:15:352014 剛剛在指導學長使用雙重指標,將心得分享上來 如果今天已經預先將值放在程式碼內,而不用fopen去讀檔該怎麼做 #include #include //預先放置之副程式 voidsource(int**s){ *(*(s+0)+0)=0; *(*(s+0)+1)=1; *(*(s+1)+0)=2; *(*(s+1)+1)=3; } intmain(){ int**f; inti,j; //要先配置喔! f=(int**)malloc(sizeof(*f)*2); for(i=0;i<2;i++){ *(f+i)=(int*)malloc(sizeof(*f)*2); } //從副程式取值 source(f); for(i=0;i<2;i++){ for(j=0;j<2;j++) printf("%d",*(*(f+i)+j)); printf("\n"); } /*指標用完記得free啊!!指標用完記得free啊!!指標用完記得free啊!! 很重要,所以說三次(13誡之六)*/ for(i=0;i<2;i++) free(*(f+i)); free(f); system("pause"); return0; } 這方法好處是免用迴圈一直在讀值,而且可以解決有些編譯器沒辦法用fopen 像做嵌入式系統設計就不一定有fopen唷! 但是對初學者來說會糊里糊塗的,不知道自己在讀什麼值 有任何不好的地方歡迎高手指教謝謝 -- ※發信站:批踢踢實業坊(ptt.cc),來自:140.136.146.114 ※文章網址:http://www.ptt.cc/bbs/C_and_CPP/M.1417526139.A.F30.html ※編輯:jacky1989(140.136.146.114),12/02/201421:17:06 ※編輯:jacky1989(140.136.146.114),12/02/201421:20:35 →x000032001:不就動態二維陣列而已@@?12/0221:32 不是每個初學者都懂呀!! 推purpose:*(*(s+1)+0)=2;寫成s[1][0]=2;就好,省力12/0222:28 →purpose:*(f+i)=(int*)malloc(sizeof(*f)*2);你是要存整數吧12/0222:29 →purpose:*(f+i)=(int*)malloc(sizeof(int)*2);就可以12/0222:29 ※編輯:jacky1989(118.233.78.140),12/02/201422:48:09 ※編輯:jacky1989(118.233.78.140),12/02/201422:48:39 →handsome616:小聲問什麼情況要用迴圈一直讀值?12/0222:51 那我小聲回答 如果是intsource(intindex)這種狀況就要 在主程式內用 for(i=0;i<2;i++){ for(j=0;j<2;j++){ *(*(f+i)+j)=source(i*2+j); } } 但是這比較常見在初學者 ※編輯:jacky1989(118.233.78.140),12/02/201422:55:23 →ACMANIAC:看不太懂重點是什麼,這跟雙重指標有什麼關係?12/0223:03 →ACMANIAC:要做同樣的事情用陣列不就行了,程式碼也少了快一半12/0223:04 如果今天所需要的陣列大小是256*256 值是沒有規律性的 也可以直接用二維陣列來完成嗎? ※編輯:jacky1989(118.233.78.140),12/02/201423:39:38 推CaptainH:只要編譯期能決定大小的都可以用陣列12/0223:44 但是上次我用200*200的陣列在執行時就已經出問題了耶 ※編輯:jacky1989(118.233.78.140),12/02/201423:46:40 推CaptainH:丟到全域變數12/0223:49 全域變數可以解決200*200會錯的問題??? ※編輯:jacky1989(118.233.78.140),12/02/201423:52:11 →CaptainH:我猜你所謂的錯指執行時segmentationfualt12/0300:08 →CaptainH:這通常是因為stack不夠的關係,放到全域變數可以解決12/0300:10 →CaptainH:動態記憶體配置是用來解決執行期才能得知大小的陣列。

你12/0300:12 →CaptainH:的例子並沒有表現出這點。

12/0300:12 原來是這樣,感謝指導,已筆記 →bibo9901:我一直覺得"雙重指標"是一個很奇怪名詞12/0300:22 是嗎??很多人都說雙重指標啊!! ※編輯:jacky1989(118.233.78.140),12/03/201400:23:50 →bibo9901:雙重人格、雙重積分、雙重國籍都是指"兩個",但是雙重指12/0300:27 →bibo9901:標卻是pointertopointer,只有一個指標,沒有兩個.12/0300:28 那請教**p該如何稱呼?? ※編輯:jacky1989(118.233.78.140),12/03/201400:31:02 →bibo9901:就說啦,pointertopointer12/0300:31 中文==,難道要講指標對指標嗎? ※編輯:jacky1989(118.233.78.140),12/03/201400:32:39 →bibo9901:指標的指標.英文也沒在講doublepointer的12/0300:34 以前老師一樣是教雙重指標 就這樣沿用吧!!兩種都有人講 ※編輯:jacky1989(118.233.78.140),12/03/201400:37:00 →ACMANIAC:雙重指標很常見,doublepointer也是有人講12/0300:44 推Bencrie:用一維就好,index自己算12/0301:08 →carylorrk:就算用pointertopointer還是會先allocate一維的12/0301:18 →carylorrk:陣列吧?至少可以保持記memory的連續性。

不過最好還12/0301:19 →carylorrk:是一維+自己算index,因為多一層dereference有時差12/0301:19 →carylorrk:別挺大的。

12/0301:19 →q82419:*(*(s+1)+0)=2;不能寫成s[1][0]=2;13誡之1212/0303:10 →q82419:應該是f=(int**)malloc(sizeof(*int)*2);12/0303:13 →q82419:跟*(f+i)=(int*)malloc(sizeof(int)*2);12/0303:13 →q82419:要把值放進程式內通常會幫input建立成一個更完整一點的12/0303:14 →q82419:資料結構包成structclass之類的12/0303:14 →ACMANIAC:樓上你搞錯了,13誡之12講的是二維陣列不能用pointer12/0305:04 →ACMANIAC:topointer傳入,而不是指標不能改寫成陣列形式...12/0305:05 推dirkc:全域或static陣列都可,或者用ulimit-s改預設stack大小12/0318:02 →dirkc:如果有支援ulimit又有這個需求的話12/0318:02 →dirkc:題外話,不管是**p或********p,我會都叫它們指標12/0318:03 →dirkc:英文是pointer.Apointertopointerisstillapointer.12/0318:10 →dirkc:初始化的全域或static變數通常放在檔案的.data區域中12/0318:31 →dirkc:函式內的區域變數則通常用stack來管理12/0318:34 推johnpage:三維動態陣列是多重指標嗎?12/0408:20 推s25g5d4:個人比較偏好sizeof(int*)*m+sizeof(int)*m*n12/0411:30 →saladim:程式有錯你把type換成double就出錯了12/0419:38 哪邊換double?? ※編輯:jacky1989(118.233.78.140),12/04/201423:44:17 →loveme00835:好恐怖喔…我一定會用ADT封裝起來,兩個星星以上12/0502:18 →loveme00835:理解不能12/0502:18 →scwg:回圈裡的malloc應該是sizeof(**f)*2,不然f宣告成12/0502:43 →scwg:double**f;空間就沒拿夠12/0502:43 推lepin2001:推心得分享12/0800:45



請為這篇文章評分?