原文位址::http://hi.baidu.com/b_a_i_du/blog/item/7125a7d35ca0afd6a8ec9af6.html?
相關網帖
1.給指向指針的指針配置設定和釋放記憶體 ----http://xingshi5216.blog.163.com/blog/static/4603159120086189321587/
2.釋放使用指針的指針所配置設定到的空間----http://blog.sina.com.cn/s/blog_5fd9454d0100drfw.html
本文來自http://www.codeproject.com/useritems/pointertopointer.asp一文,有感作者對指向指針的指針有着清晰和形象的解釋,特将其重要思想摘記下來。
指向指針的指針變量
一個指向指針的指針變量能夠儲存另一個指針變量的位址。可以用如下聲明:
type **variable ;
配置設定記憶體
可以把配置設定給指向指針的指針變量的記憶體視為二維結構。它有這相關的行和列。例如,對與大小為m*n的記憶體,視為有m行,而每行又有這n列。是以,配置設定記憶體時:
1.首先為m行配置設定記憶體
2.對每一行再配置設定n列記憶體
例子:為一個指向浮點數的指針的指針配置設定記憶體,假設有4行3列
float **float_values ;
//為行配置設定變量
float_values=(float **)malloc(4*sizeof(float *));
//為每行的列非陪記憶體
for(int i =0 ;i<4 ;i++)
{
*(float_values+i)=(float*)malloc(3*sizeof(float));
}
指派
有兩種方法通路二維的記憶體位址:
1.用[]操作符,類似與通路二維數組:
for(int i=0; i< 4 ;i++)
for(int j=0 ;j<3 ;j++)
{
scanf("%f",&val);
float_values[i][j]=val;
}
2.指針操作符(*)
for(int i=0; i< 4 ;i++)
for(int j=0 ;j<3 ;j++)
{
scanf("%f",&val);
*((*float_values+i)+j)=val;
}
釋放記憶體
對于動态配置設定的記憶體,我們需要将其釋放。釋放要從最底層開始,和配置設定是順序剛好相反。如果我們先釋放了高層的指針,這樣我們就會丢失底層的指針,進而無法釋放那些指針指向的記憶體,造成記憶體洩漏。正确的釋放記憶體方法如下:
//freeing up memoryallocated to second level pointers
for(int i = 0; i<4; i++)
{
free(float_values[i]);
}
//freeing up memoryallocated to first level pointers
free(float_values);
from:http://read.newbooks.com.cn/info/165197.html
//=================================================================
備注::
1.WINDOWS的程式在調試指針有沒被釋放,可以去看指針所指向的記憶體區域的内容是否被釋放了。
在VC++ IDE下可以到調試視窗的MEMORY視窗去看指針指向的記憶體今天是什麼内容,有沒被釋放