指向指針的指針變量
一個指向指針的指針變量能夠保存另一個指針變量的地址??梢杂萌缦侣暶鳎?BR> type **variable ;
分配內(nèi)存
可以把分配給指向指針的指針變量的內(nèi)存視為二維結(jié)構(gòu)。它有這相關(guān)的行和列。例如,對與大小為m*n的內(nèi)存,視為有m行,而每行又有這n列。因此,分配內(nèi)存時:
1.首先為m行分配內(nèi)存
2.對每一行再分配n列內(nèi)存
例子:為一個指向浮點數(shù)的指針的指針分配內(nèi)存,假設有4行3列
float **float_values ;
//為行分配變量
float_values=(float **)malloc(4*sizeof(float *));
//為每行的列非陪內(nèi)存
for(int i =0 ;i<4 ;i++)
{
*(float_values+i)=(float*)malloc(3*sizeof(float));
}
賦值
有兩種方法訪問二維的內(nèi)存地址:
1.用[]操作符,類似與訪問二維數(shù)組:
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;
}
釋放內(nèi)存
對于動態(tài)分配的內(nèi)存,我們需要將其釋放。釋放要從最底層開始,和分配是順序剛好相反。如果我們先釋放了高層的指針,這樣我們就會丟失底層的指針,從而無法釋放那些指針指向的內(nèi)存,造成內(nèi)存泄漏。正確的釋放內(nèi)存方法如下:
//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);
一個指向指針的指針變量能夠保存另一個指針變量的地址??梢杂萌缦侣暶鳎?BR> type **variable ;
分配內(nèi)存
可以把分配給指向指針的指針變量的內(nèi)存視為二維結(jié)構(gòu)。它有這相關(guān)的行和列。例如,對與大小為m*n的內(nèi)存,視為有m行,而每行又有這n列。因此,分配內(nèi)存時:
1.首先為m行分配內(nèi)存
2.對每一行再分配n列內(nèi)存
例子:為一個指向浮點數(shù)的指針的指針分配內(nèi)存,假設有4行3列
float **float_values ;
//為行分配變量
float_values=(float **)malloc(4*sizeof(float *));
//為每行的列非陪內(nèi)存
for(int i =0 ;i<4 ;i++)
{
*(float_values+i)=(float*)malloc(3*sizeof(float));
}
賦值
有兩種方法訪問二維的內(nèi)存地址:
1.用[]操作符,類似與訪問二維數(shù)組:
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;
}
釋放內(nèi)存
對于動態(tài)分配的內(nèi)存,我們需要將其釋放。釋放要從最底層開始,和分配是順序剛好相反。如果我們先釋放了高層的指針,這樣我們就會丟失底層的指針,從而無法釋放那些指針指向的內(nèi)存,造成內(nèi)存泄漏。正確的釋放內(nèi)存方法如下:
//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);

