天天看點

資料結構學習(二)指針和記憶體那些事兒

  地球人都知道,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