看板 C_and_CPP 關於我們 聯絡資訊
剛剛在指導學長使用雙重指標,將心得分享上來 如果今天已經預先將值放在程式碼內,而不用fopen去讀檔該怎麼做 #include<stdlib.h> #include<stdio.h> //預先放置之副程式 void source(int **s){ *(*(s+0)+0) = 0; *(*(s+0)+1) = 1; *(*(s+1)+0) = 2; *(*(s+1)+1) = 3; } int main(){ int **f; int i,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"); return 0; } 這方法好處是免用迴圈一直在讀值,而且可以解決有些編譯器沒辦法用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/2014 21:17:06 ※ 編輯: jacky1989 (140.136.146.114), 12/02/2014 21:20:35
x000032001: 不就動態二維陣列而已@@? 12/02 21:32
不是每個初學者都懂呀!!
purpose: *(*(s+1)+0) = 2; 寫成 s[1][0] = 2; 就好,省力 12/02 22:28
purpose: *(f+i) = (int *)malloc(sizeof(*f)*2); 你是要存整數吧 12/02 22:29
purpose: *(f+i) = (int *)malloc(sizeof(int)*2); 就可以 12/02 22:29
※ 編輯: jacky1989 (118.233.78.140), 12/02/2014 22:48:09 ※ 編輯: jacky1989 (118.233.78.140), 12/02/2014 22:48:39
handsome616: 小聲問什麼情況要用迴圈一直讀值? 12/02 22:51
那我小聲回答 如果是int source(int index)這種狀況就要 在主程式內用 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/2014 22:55:23
ACMANIAC: 看不太懂重點是什麼,這跟雙重指標有什麼關係? 12/02 23:03
ACMANIAC: 要做同樣的事情用陣列不就行了,程式碼也少了快一半 12/02 23:04
如果今天所需要的陣列大小是256*256 值是沒有規律性的 也可以直接用二維陣列來完成嗎? ※ 編輯: jacky1989 (118.233.78.140), 12/02/2014 23:39:38
CaptainH: 只要編譯期能決定大小的 都可以用陣列 12/02 23:44
但是上次我用200*200的陣列在執行時就已經出問題了耶 ※ 編輯: jacky1989 (118.233.78.140), 12/02/2014 23:46:40
CaptainH: 丟到全域變數 12/02 23:49
全域變數可以解決200*200會錯的問題??? ※ 編輯: jacky1989 (118.233.78.140), 12/02/2014 23:52:11
CaptainH: 我猜你所謂的錯指執行時segmentation fualt 12/03 00:08
CaptainH: 這通常是因為stack不夠的關係,放到全域變數可以解決 12/03 00:10
CaptainH: 動態記憶體配置是用來解決執行期才能得知大小的陣列。你 12/03 00:12
CaptainH: 的例子並沒有表現出這點。 12/03 00:12
原來是這樣,感謝指導,已筆記
bibo9901: 我一直覺得"雙重指標"是一個很奇怪名詞 12/03 00:22
是嗎??很多人都說雙重指標啊!! ※ 編輯: jacky1989 (118.233.78.140), 12/03/2014 00:23:50
bibo9901: 雙重人格、雙重積分、雙重國籍都是指"兩個", 但是雙重指 12/03 00:27
bibo9901: 標卻是 pointer to pointer, 只有一個指標, 沒有兩個. 12/03 00:28
那請教**p該如何稱呼?? ※ 編輯: jacky1989 (118.233.78.140), 12/03/2014 00:31:02
bibo9901: 就說啦, pointer to pointer 12/03 00:31
中文= =,難道要講指標對指標嗎? ※ 編輯: jacky1989 (118.233.78.140), 12/03/2014 00:32:39
bibo9901: 指標的指標. 英文也沒在講 double pointer 的 12/03 00:34
以前老師一樣是教雙重指標 就這樣沿用吧!!兩種都有人講 ※ 編輯: jacky1989 (118.233.78.140), 12/03/2014 00:37:00
ACMANIAC: 雙重指標很常見,double pointer 也是有人講 12/03 00:44
Bencrie: 用一維就好,index 自己算 12/03 01:08
carylorrk: 就算用 pointer to pointer 還是會先 allocate 一維的 12/03 01:18
carylorrk: 陣列吧?至少可以保持記 memory 的連續性。不過最好還 12/03 01:19
carylorrk: 是一維+自己算 index,因為多一層 dereference 有時差 12/03 01:19
carylorrk: 別挺大的。 12/03 01:19
q82419: *(*(s+1)+0) = 2; 不能寫成 s[1][0] = 2; 13誡之12 12/03 03:10
q82419: 應該是 f = (int **)malloc(sizeof(*int)*2); 12/03 03:13
q82419: 跟 *(f+i) = (int *)malloc(sizeof(int)*2); 12/03 03:13
q82419: 要把值放進程式內通常會幫input建立成一個更完整一點的 12/03 03:14
q82419: 資料結構 包成struct class之類的 12/03 03:14
ACMANIAC: 樓上你搞錯了,13誡之12 講的是二維陣列不能用 pointer 12/03 05:04
ACMANIAC: to pointer 傳入,而不是指標不能改寫成陣列形式... 12/03 05:05
dirkc: 全域或static陣列都可,或者用ulimit -s改預設stack大小 12/03 18:02
dirkc: 如果有支援ulimit又有這個需求的話 12/03 18:02
dirkc: 題外話,不管是 **p 或 ********p,我會都叫它們指標 12/03 18:03
dirkc: 英文是pointer. A pointer to pointer is still a pointer. 12/03 18:10
dirkc: 初始化的全域或static變數通常放在檔案的.data區域中 12/03 18:31
dirkc: 函式內的區域變數則通常用stack來管理 12/03 18:34
johnpage: 三維動態陣列是多重指標嗎? 12/04 08:20
s25g5d4: 個人比較偏好 sizeof(int*)*m + sizeof(int)*m*n 12/04 11:30
saladim: 程式有錯 你把type換成double就出錯了 12/04 19:38
哪邊換double?? ※ 編輯: jacky1989 (118.233.78.140), 12/04/2014 23:44:17
loveme00835: 好恐怖喔… 我一定會用 ADT 封裝起來,兩個星星以上 12/05 02:18
loveme00835: 理解不能 12/05 02:18
scwg: 回圈裡的 malloc 應該是 sizeof(**f)*2, 不然 f 宣告成 12/05 02:43
scwg: double ** f; 空間就沒拿夠 12/05 02:43
lepin2001: 推心得分享 12/08 00:45