[分享] 雙重指標小應用

看板C_and_CPP作者 (幻想的夢境)時間9年前 (2014/12/02 21:15), 9年前編輯推噓8(8037)
留言45則, 16人參與, 最新討論串1/1
剛剛在指導學長使用雙重指標,將心得分享上來 如果今天已經預先將值放在程式碼內,而不用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

12/02 21:32, , 1F
不就動態二維陣列而已@@?
12/02 21:32, 1F
不是每個初學者都懂呀!!

12/02 22:28, , 2F
*(*(s+1)+0) = 2; 寫成 s[1][0] = 2; 就好,省力
12/02 22:28, 2F

12/02 22:29, , 3F
*(f+i) = (int *)malloc(sizeof(*f)*2); 你是要存整數吧
12/02 22:29, 3F

12/02 22:29, , 4F
*(f+i) = (int *)malloc(sizeof(int)*2); 就可以
12/02 22:29, 4F
※ 編輯: jacky1989 (118.233.78.140), 12/02/2014 22:48:09 ※ 編輯: jacky1989 (118.233.78.140), 12/02/2014 22:48:39

12/02 22:51, , 5F
小聲問什麼情況要用迴圈一直讀值?
12/02 22:51, 5F
那我小聲回答 如果是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

12/02 23:03, , 6F
看不太懂重點是什麼,這跟雙重指標有什麼關係?
12/02 23:03, 6F

12/02 23:04, , 7F
要做同樣的事情用陣列不就行了,程式碼也少了快一半
12/02 23:04, 7F
如果今天所需要的陣列大小是256*256 值是沒有規律性的 也可以直接用二維陣列來完成嗎? ※ 編輯: jacky1989 (118.233.78.140), 12/02/2014 23:39:38

12/02 23:44, , 8F
只要編譯期能決定大小的 都可以用陣列
12/02 23:44, 8F
但是上次我用200*200的陣列在執行時就已經出問題了耶 ※ 編輯: jacky1989 (118.233.78.140), 12/02/2014 23:46:40

12/02 23:49, , 9F
丟到全域變數
12/02 23:49, 9F
全域變數可以解決200*200會錯的問題??? ※ 編輯: jacky1989 (118.233.78.140), 12/02/2014 23:52:11

12/03 00:08, , 10F
我猜你所謂的錯指執行時segmentation fualt
12/03 00:08, 10F

12/03 00:10, , 11F
這通常是因為stack不夠的關係,放到全域變數可以解決
12/03 00:10, 11F

12/03 00:12, , 12F
動態記憶體配置是用來解決執行期才能得知大小的陣列。你
12/03 00:12, 12F

12/03 00:12, , 13F
的例子並沒有表現出這點。
12/03 00:12, 13F
原來是這樣,感謝指導,已筆記

12/03 00:22, , 14F
我一直覺得"雙重指標"是一個很奇怪名詞
12/03 00:22, 14F
是嗎??很多人都說雙重指標啊!! ※ 編輯: jacky1989 (118.233.78.140), 12/03/2014 00:23:50

12/03 00:27, , 15F
雙重人格、雙重積分、雙重國籍都是指"兩個", 但是雙重指
12/03 00:27, 15F

12/03 00:28, , 16F
標卻是 pointer to pointer, 只有一個指標, 沒有兩個.
12/03 00:28, 16F
那請教**p該如何稱呼?? ※ 編輯: jacky1989 (118.233.78.140), 12/03/2014 00:31:02

12/03 00:31, , 17F
就說啦, pointer to pointer
12/03 00:31, 17F
中文= =,難道要講指標對指標嗎? ※ 編輯: jacky1989 (118.233.78.140), 12/03/2014 00:32:39

12/03 00:34, , 18F
指標的指標. 英文也沒在講 double pointer 的
12/03 00:34, 18F
以前老師一樣是教雙重指標 就這樣沿用吧!!兩種都有人講 ※ 編輯: jacky1989 (118.233.78.140), 12/03/2014 00:37:00

12/03 00:44, , 19F
雙重指標很常見,double pointer 也是有人講
12/03 00:44, 19F

12/03 01:08, , 20F
用一維就好,index 自己算
12/03 01:08, 20F

12/03 01:18, , 21F
就算用 pointer to pointer 還是會先 allocate 一維的
12/03 01:18, 21F

12/03 01:19, , 22F
陣列吧?至少可以保持記 memory 的連續性。不過最好還
12/03 01:19, 22F

12/03 01:19, , 23F
是一維+自己算 index,因為多一層 dereference 有時差
12/03 01:19, 23F

12/03 01:19, , 24F
別挺大的。
12/03 01:19, 24F

12/03 03:10, , 25F
*(*(s+1)+0) = 2; 不能寫成 s[1][0] = 2; 13誡之12
12/03 03:10, 25F

12/03 03:13, , 26F
應該是 f = (int **)malloc(sizeof(*int)*2);
12/03 03:13, 26F

12/03 03:13, , 27F
跟 *(f+i) = (int *)malloc(sizeof(int)*2);
12/03 03:13, 27F

12/03 03:14, , 28F
要把值放進程式內通常會幫input建立成一個更完整一點的
12/03 03:14, 28F

12/03 03:14, , 29F
資料結構 包成struct class之類的
12/03 03:14, 29F

12/03 05:04, , 30F
樓上你搞錯了,13誡之12 講的是二維陣列不能用 pointer
12/03 05:04, 30F

12/03 05:05, , 31F
to pointer 傳入,而不是指標不能改寫成陣列形式...
12/03 05:05, 31F

12/03 18:02, , 32F
全域或static陣列都可,或者用ulimit -s改預設stack大小
12/03 18:02, 32F

12/03 18:02, , 33F
如果有支援ulimit又有這個需求的話
12/03 18:02, 33F

12/03 18:03, , 34F
題外話,不管是 **p 或 ********p,我會都叫它們指標
12/03 18:03, 34F

12/03 18:10, , 35F
英文是pointer. A pointer to pointer is still a pointer.
12/03 18:10, 35F

12/03 18:31, , 36F
初始化的全域或static變數通常放在檔案的.data區域中
12/03 18:31, 36F

12/03 18:34, , 37F
函式內的區域變數則通常用stack來管理
12/03 18:34, 37F

12/04 08:20, , 38F
三維動態陣列是多重指標嗎?
12/04 08:20, 38F

12/04 11:30, , 39F
個人比較偏好 sizeof(int*)*m + sizeof(int)*m*n
12/04 11:30, 39F

12/04 19:38, , 40F
程式有錯 你把type換成double就出錯了
12/04 19:38, 40F
哪邊換double?? ※ 編輯: jacky1989 (118.233.78.140), 12/04/2014 23:44:17

12/05 02:18, , 41F
好恐怖喔… 我一定會用 ADT 封裝起來,兩個星星以上
12/05 02:18, 41F

12/05 02:18, , 42F
理解不能
12/05 02:18, 42F

12/05 02:43, , 43F
回圈裡的 malloc 應該是 sizeof(**f)*2, 不然 f 宣告成
12/05 02:43, 43F

12/05 02:43, , 44F
double ** f; 空間就沒拿夠
12/05 02:43, 44F

12/08 00:45, , 45F
推心得分享
12/08 00:45, 45F
文章代碼(AID): #1KVRjxym (C_and_CPP)