討論區快速選單
知識庫快速選單
程式設計俱樂部Facebook粉絲團 政府補助!學嵌入式+物聯網 傑米的攝影旅遊筆記
[ 回上頁 ] [ 討論區發言規則 ]
請教雙重指標 int **ptr的使用時機
更改我的閱讀文章字型大小
作者 : hivc(颭)
[ 貼文 92 | 人氣 8472 | 評價 310 | 評價/貼文 3.37 | 送出評價 26 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2005/11/2 上午 10:29:14
請教各位前輩
小弟在學習指標時發現,
指標在變數,結構,陣列,函數都可以使用
那雙重指標 int **ptr;
主要是用在什麼時機呢
(什麼情況下普通指標不支援,非要使用雙重指標,才能達到呢?)
或是什麼情況下使用雙重指標可以讓程式設計的效能,可讀性進步呢
感謝回應
作者 : player(PLAYER) 貼文超過1000則人氣指數超過100000點
[ 貼文 1595 | 人氣 138661 | 評價 2840 | 評價/貼文 1.78 | 送出評價 104 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
主題發起人hivc註記此篇回應為最佳解答 2005/11/2 上午 10:37:31
指標傳回用

例如在函式內配置一塊記憶體
利用指標的指標方式傳回
例如


bool new_int_array(int nConut, int** ppRet)
{
   int* pData = new int[nConut];
   if (pData == NULL)
   {
     *ppRet = NULL;
     retrun false;
   }
   *ppRet = pData;
   return true;
}

  
作者 : windblown(windblown) VC++優秀好手C++ Builder曠世奇才C++卓越專家貼文超過1000則
[ 貼文 1105 | 人氣 890 | 評價 9400 | 評價/貼文 8.51 | 送出評價 200 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
主題發起人hivc註記此篇回應為最佳解答 2005/11/2 上午 10:42:54
我也講一個: 二維陣列的配置
可以參考之前討論區, 其他網友的討論
作者 : hivc(颭)
[ 貼文 92 | 人氣 8472 | 評價 310 | 評價/貼文 3.37 | 送出評價 26 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2005/11/2 上午 10:54:50
>指標傳回用
>
>例如在函式內配置一塊記憶體
>利用指標的指標方式傳回

windblown大大的回應,用在多維陣列,小弟大概能了解了
但是在 "函式內配置一塊記憶體" 小弟就有點搞不太清楚
函式內配置的記憶體不是屬於區域變數嗎
一離開函式好像就會失效
為什麼還要特地用雙重指標指回去呢?
謝謝
作者 : player(PLAYER) 貼文超過1000則人氣指數超過100000點
[ 貼文 1595 | 人氣 138661 | 評價 2840 | 評價/貼文 1.78 | 送出評價 104 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
主題發起人hivc註記此篇回應為最佳解答 2005/11/2 下午 02:40:22
new 所配置的記憶體
是可以扔到函式外的
所以
請不要被以往的觀念所誤導

只有非動態的區域變數
其變數的生命期
才會被限制在函式內

例如

int* pData = new int[10];

int nData[10];

只有後者的變數生命期
會被限制在函式內

不過用 new所配置的記憶體
最好在確定不用時
delete
不然可能會有記憶體裂縫
(沒有在用的記憶體區段沒放掉, 影響到後面的程式在配置記憶體時, 可能導致記憶體不足的問題)
作者 : johnny6740(牧童哥) VC++優秀好手驅動程式優秀好手Assembly優秀好手貼文超過500則人氣指數超過10000點
[ 貼文 791 | 人氣 24021 | 評價 3770 | 評價/貼文 4.77 | 送出評價 31 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
主題發起人hivc註記此篇回應為很有道理 2005/11/2 下午 05:12:06
假設你要函式傳一個整數回來,那你的函式會宣告成

void foo(int *pNum)

所以如果你要函式傳一個整數的指標回來,那就會宣告成

void foo(int **ppNum)

如果這樣不容易瞭解,改成這樣看看

#define LPint int*
void foo(LPint *ppNum)

把 LPint 當成一種資料型態,是否就容易理解了
作者 : hivc(颭)
[ 貼文 92 | 人氣 8472 | 評價 310 | 評價/貼文 3.37 | 送出評價 26 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2005/11/2 下午 09:39:50
Thanks!!
作者 : akira32(Akira) VC++優秀好手DirectX優秀好手貼文超過2000則人氣指數超過350000點
[ 貼文 2527 | 人氣 384134 | 評價 3430 | 評價/貼文 1.36 | 送出評價 243 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2005/11/2 下午 09:48:48
請問一下是不是這樣應用?
要在這個函式OnButton1()把pData釋放掉的話要如何寫呢?

bool new_int_array(int nConut, int** ppRet)
{
int* pData = new int[nConut];
if (pData == NULL)
{
*ppRet = NULL;
return false;
}

for (int i=0;i<nConut;i++)
{
pData[i]=i;
}

*ppRet = pData;
return true;
}

void CTest11022Dlg::OnButton1()
{
int *pRet=new int[1];
int nCount=3;

bool b=new_int_array(nCount,&pRet);

delete pRet;
}
作者 : windblown(windblown) VC++優秀好手C++ Builder曠世奇才C++卓越專家貼文超過1000則
[ 貼文 1105 | 人氣 890 | 評價 9400 | 評價/貼文 8.51 | 送出評價 200 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
主題發起人hivc註記此篇回應為很有道理 2005/11/2 下午 10:08:26
int *pRet=new int[1]; 改成 int *pRet;
因為記憶體的配置工作, 已經在 new_int_array() 處理了

delete pRet; 改成
if ( b ) { // new_int_array() 成功
  delete [] pRet;
}
作者 : akira32(Akira) VC++優秀好手DirectX優秀好手貼文超過2000則人氣指數超過350000點
[ 貼文 2527 | 人氣 384134 | 評價 3430 | 評價/貼文 1.36 | 送出評價 243 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2005/11/3 下午 03:45:50
無法釋放掉new_int_array所產生的memory

Detected memory leaks!
Dumping objects ->
D:\Test1103\Test1103Dlg.cpp(195) : {73} normal block at 0x00344480, 4 bytes long.
 Data: < > CD CD CD CD
Object dump complete.
作者 : johnny6740(牧童哥) VC++優秀好手驅動程式優秀好手Assembly優秀好手貼文超過500則人氣指數超過10000點
[ 貼文 791 | 人氣 24021 | 評價 3770 | 評價/貼文 4.77 | 送出評價 31 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
主題發起人hivc註記此篇回應為很有道理 2005/11/3 下午 04:51:12
這個錯誤訊息是因為

int *pRet=new int[1];

所產生的,當你配置完 pRet 後,又把 pRet 傳到 new_int_array() 去配置另一塊記憶體,而最後 delete 的記憶體是 new_int_array() 中配置的記憶體,所以第一次配置的記憶體就變成孤兒,沒有 delete

只要照 windblown 的方式修改就可正常執行了
作者 : nietzsche(尼采) VC++優秀好手C++優秀好手貼文超過500則
[ 貼文 501 | 人氣 3089 | 評價 2900 | 評價/貼文 5.79 | 送出評價 5 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2005/12/29 下午 04:19:49
有一個比較好的方式...
即然都是由 function 內部去配置記憶體了,
就該寫另一個 function 去釋放記憶體,
因為如果這個 function 是別人寫的,
你根本不知道他怎麼配置的...
 板主 : 青衫 , Raymond
 > Visual C++ - 討論區
 - 最近熱門問答精華集
 - 全部歷史問答精華集
 - Visual C++ - 知識庫
  ■ 全站最新Post列表
  ■ 我的文章收藏
  ■ 我最愛的作者
  ■ 全站文章收藏排行榜
  ■ 全站最愛作者排行榜
  ■  月熱門主題
  ■  季熱門主題
  ■  熱門主題Top 20
  ■  本區Post排行榜
  ■  本區評價排行榜
  ■  全站專家名人榜
  ■  全站Post排行榜
  ■  全站評價排行榜
  ■  全站人氣排行榜
 請輸入關鍵字 
  開始搜尋
 
Top 10
評價排行
Visual C++
1 青衫 11070 
2 Raymond 10090 
3 Clier 7630 
4 小約翰 2500 
5 Cog 2030 
6 coco 1870 
7 aming 1410 
8 牧童哥 1400 
9 r2109 1380 
10 Akira 1350 
Visual C++
  專家等級 評價  
  一代宗師 10000  
  曠世奇才 5000  
  頂尖高手 3000  
  卓越專家 1500  
  優秀好手 750  
Microsoft Internet Explorer 6.0. Screen 1024x768 pixel. High Color (16 bit).
2000-2019 程式設計俱樂部 http://www.programmer-club.com.tw/
0.171875