[分享] 雙重指標小應用

作者: jacky1989   2014-12-02 21:15:35
剛剛在指導學長使用雙重指標,將心得分享上來
如果今天已經預先將值放在程式碼內,而不用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唷!
但是對初學者來說會糊里糊塗的,不知道自己在讀什麼值
有任何不好的地方歡迎高手指教謝謝
作者: x000032001 (版廢了該走了)   2014-12-02 21:32:00
不就動態二維陣列而已@@?
作者: purpose (秀才遇到肥宅兵)   2014-12-02 22:28:00
*(*(s+1)+0) = 2; 寫成 s[1][0] = 2; 就好,省力*(f+i) = (int *)malloc(sizeof(*f)*2); 你是要存整數吧*(f+i) = (int *)malloc(sizeof(int)*2); 就可以
作者: handsome616 (豆花伯爵)   2014-12-02 22:51:00
小聲問什麼情況要用迴圈一直讀值?
作者: ACMANIAC (請肥宅救救肥宅)   2014-12-02 23:03:00
看不太懂重點是什麼,這跟雙重指標有什麼關係?要做同樣的事情用陣列不就行了,程式碼也少了快一半
作者: CaptainH (Cannon)   2014-12-02 23:44:00
只要編譯期能決定大小的 都可以用陣列丟到全域變數我猜你所謂的錯指執行時segmentation fualt這通常是因為stack不夠的關係,放到全域變數可以解決動態記憶體配置是用來解決執行期才能得知大小的陣列。你的例子並沒有表現出這點。
作者: bibo9901 (function(){})()   2014-12-03 00:22:00
我一直覺得"雙重指標"是一個很奇怪名詞雙重人格、雙重積分、雙重國籍都是指"兩個", 但是雙重指標卻是 pointer to pointer, 只有一個指標, 沒有兩個.就說啦, pointer to pointer指標的指標. 英文也沒在講 double pointer 的
作者: ACMANIAC (請肥宅救救肥宅)   2014-12-03 00:44:00
雙重指標很常見,double pointer 也是有人講
作者: Bencrie   2014-12-03 01:08:00
用一維就好,index 自己算
作者: carylorrk (carylorrk)   2014-12-03 01:18:00
就算用 pointer to pointer 還是會先 allocate 一維的陣列吧?至少可以保持記 memory 的連續性。不過最好還是一維+自己算 index,因為多一層 dereference 有時差別挺大的。
作者: q82419 (q82419)   2014-12-03 03:10:00
*(*(s+1)+0) = 2; 不能寫成 s[1][0] = 2; 13誡之12應該是 f = (int **)malloc(sizeof(*int)*2);跟 *(f+i) = (int *)malloc(sizeof(int)*2);要把值放進程式內通常會幫input建立成一個更完整一點的資料結構 包成struct class之類的
作者: ACMANIAC (請肥宅救救肥宅)   2014-12-03 05:04:00
樓上你搞錯了,13誡之12 講的是二維陣列不能用 pointerto pointer 傳入,而不是指標不能改寫成陣列形式...
作者: dirkc (3781615)   2014-12-03 18:02:00
全域或static陣列都可,或者用ulimit -s改預設stack大小如果有支援ulimit又有這個需求的話題外話,不管是 **p 或 ********p,我會都叫它們指標英文是pointer. A pointer to pointer is still a pointer.初始化的全域或static變數通常放在檔案的.data區域中函式內的區域變數則通常用stack來管理
作者: johnpage (johnpage)   2014-12-04 08:20:00
三維動態陣列是多重指標嗎?
作者: s25g5d4 (function(){})()   2014-12-04 11:30:00
個人比較偏好 sizeof(int*)*m + sizeof(int)*m*n
作者: saladim (殺拉頂)   2014-12-04 19:38:00
程式有錯 你把type換成double就出錯了
作者: loveme00835 (髮箍)   2014-12-05 02:18:00
好恐怖喔… 我一定會用 ADT 封裝起來,兩個星星以上理解不能
作者: scwg ( )   2014-12-05 02:43:00
回圈裡的 malloc 應該是 sizeof(**f)*2, 不然 f 宣告成double ** f; 空間就沒拿夠
作者: lepin2001 (排年代的票真悶)   2014-12-08 00:45:00
推心得分享

Links booklink

Contact Us: admin [ a t ] ucptt.com