地球人都知道,C語言中記憶體和指針一直是很多人不甚明白的地方,兩者的關系也一直是猶抱琵琶半遮面,讓人迷惑不解。
最近編寫了個初始化三元組Triplet的函數,通過調試分析,指針和記憶體那層神秘的面紗被層層揭破,其實,也就那麼回事兒。
初始化三元組函數如下,内有詳細的注釋,很容易看懂,這個不是我們的重點,我們重點是分析記憶體和指針兩者的關系。
代碼Triplet.cpp
#include < stdio.h >
#include < stdlib.h >
#define OK 1
#define TRUE 1
#define ERROR 0
#define FALSE 0
#define OVERFLOW 3
typedef int Status;
typedef int Boolean;
int * InitTriplet( int v1, int v2, int v3)
{
int * T = ( int * )malloc( 3 * sizeof ( int ));
if ( ! T)
exit(OVERFLOW);
T[ 0 ] = v1;
T[ 1 ] = v2;
T[ 2 ] = v3;
return T;
}
int main( char * argc , char ** argv)
{
int * T = InitTriplet( 1 , 2 , 3 );
if (T)
{
printf( " 記憶體配置設定成功!\n " );
printf( " \nT表示的位址為%x,*T的值,也就是T[0]的值為:%d " ,T,( int )T[ 0 ]);
printf( " \nT+1表示的位址為%x,*(T+1)的值,也就是T[1]的值為:%d " ,T + 1 ,( int )T[ 1 ]);
printf( " \nT+2表示的位址為%x,*(T+2)的值,也就是T[2]的值為:%d\n " ,T + 2 ,( int ) * (T + 2 ));
}
else
{
printf( " 記憶體配置設定失敗!\n " );
exit(OVERFLOW);
}
// 暫停以便輸出
system( " pause " );
// 無論如何,傳回
return OK;
}
下面的兩張圖檔才是亮點,應該比較明白的說清楚了指針和記憶體的那些事兒,雖然他們的事兒還挺多的。
下面的圖檔是運作結果:
其實指針并不神秘,記憶體管理也就那樣,但是要用好兩者還是要心細如發,不能大意。
下面的代碼是三元組資料結構的代碼,實作了建立,排序,設定值,擷取值,最大值等功能,這裡需要了解引用變量和指派變量的差別!
Triplet完整代碼
#include < stdio.h >
#include < stdlib.h >
#define OK 1
#define TRUE 1
#define ERROR 0
#define FALSE 0
#define OVERFLOW 3
typedef int * Triplet;
typedef int Status;
typedef int Boolean;
int * InitTriplet( int v1, int v2, int v3)
{
int * T = ( int * )malloc( 3 * sizeof ( int ));
if ( ! T)
exit(OVERFLOW);
T[ 0 ] = v1;
T[ 1 ] = v2;
T[ 2 ] = v3;
return T;
}
Status InitTriplet2(Triplet & T, int v1, int v2, int v3)
{
T = ( int * )malloc( 3 * sizeof ( int ));
if ( ! (T))
{
printf( " 記憶體配置設定失敗!\n " );
exit(OVERFLOW);
}
else
{
(T)[ 0 ] = v1;
(T)[ 1 ] = v2;
(T)[ 2 ] = v3;
}
return OK;
}
Status DestroyTriplet(Triplet & T)
{
// 如果T不為NULL,才釋放
if (T)
{
free(T);
}
// 設定T為0x00000000,也就是NULL
T = NULL;
return OK;
}
Status Get(Triplet T, int i, int & e)
{
if (i < 1 || i > 3 ) return ERROR;
e = T[i - 1 ];
return OK;
}
Status Set(Triplet & T, int i, int e)
{
if (i < 1 || i > 3 ) return ERROR;
T[i - 1 ] = e;
return OK;
}
Boolean IsAscending(Triplet T)
{
return (T[ 0 ] <= T[ 1 ]) && (T[ 1 ] <= T[ 2 ]);
}
Boolean IsDescending(Triplet T)
{
return (T[ 0 ] >= T[ 1 ]) && (T[ 1 ] >= T[ 2 ]);
}
Status Max(Triplet T, int & e)
{
e = (T[ 0 ] >= T[ 1 ]) ? (T[ 0 ] >= T[ 2 ] ? T[ 0 ]:T[ 2 ]):(T[ 1 ] >= T[ 2 ] ? T[ 1 ]:T[ 2 ]);
return OK;
}
Status Min(Triplet T, int & e)
{
e = (T[ 0 ] <= T[ 1 ]) ? (T[ 0 ] <= T[ 2 ] ? T[ 0 ]:T[ 2 ]):(T[ 1 ] <= T[ 2 ] ? T[ 1 ]:T[ 2 ]);
return OK;
}
int main( char * argc , char ** argv)
{
int * T2 = NULL;
if (InitTriplet2(T2, 4 , 5 , 6 ))
{
printf( " 1.記憶體配置設定成功!\n " );
printf( " \nT2表示的位址為%x,*T2的值,也就是T2[0]的值為:%d " ,T2,( int )T2[ 0 ]);
printf( " \nT2+1表示的位址為%x,*(T2+1)的值,也就是T2[1]的值為:%d " ,T2 + 1 ,( int )T2[ 1 ]);
printf( " \nT2+2表示的位址為%x,*(T2+2)的值,也就是T2[2]的值為:%d\n " ,T2 + 2 ,( int ) * (T2 + 2 ));
int tmp;
Get(T2, 2 ,tmp);
printf( " T2[1]的值為:%d\n " ,tmp);
if (IsAscending(T2))
{
printf( " T2升序排列\n " );
}
else if (IsDescending(T2))
{
printf( " T2降序排列\n " );
}
else
{
printf( " T2完全無序\n " );
}
Set(T2, 2 , 8 );
Get(T2, 2 ,tmp);
printf( " T2[1]設定新值後,T2[1]的值為:%d\n " ,tmp);
Max(T2,tmp);
printf( " T2的最大值為:%d\n " ,tmp);
Min(T2,tmp);
printf( " T2的最小值為:%d\n " ,tmp);
if (DestroyTriplet(T2))
{
printf( " T2的記憶體被釋放!\n " );
}
else
{
printf( " T2釋放記憶體失敗! " );
}
}
int * T = InitTriplet( 1 , 2 , 3 );
if (T)
{
printf( " \n2.記憶體配置設定成功!\n " );
printf( " \nT表示的位址為%x,*T的值,也就是T[0]的值為:%d " ,T,( int )T[ 0 ]);
printf( " \nT+1表示的位址為%x,*(T+1)的值,也就是T[1]的值為:%d " ,T + 1 ,( int )T[ 1 ]);
printf( " \nT+2表示的位址為%x,*(T+2)的值,也就是T[2]的值為:%d\n " ,T + 2 ,( int ) * (T + 2 ));
}
else
{
printf( " 記憶體配置設定失敗!\n " );
exit(OVERFLOW);
}
// 暫停以便輸出
system( " pause " );
// 無論如何,傳回
return OK;
}
轉載于:https://www.cnblogs.com/zxher/archive/2010/06/12/1756857.html