作者jacky1989 (幻想的夢境)
看板C_and_CPP
標題[分享] 雙重指標小應用
時間Tue Dec 2 21:15:35 2014
剛剛在指導學長使用雙重指標,將心得分享上來
如果今天已經預先將值放在程式碼內,而不用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