通過2級指針改變1級指針的指向

#include "stdio.h"
#include "stdlib.h"
#include "string.h"

//2級指針作爲函數參數,來修改主函數中1級指針的值
//函數的運算結果,可以通過指針做函數參數的形式甩出來
void getMem(char **p)
{
    *p = 400;  //間接賦值,p2是p1的地址
}

//函數參數 char **myp1  表示定義了一個2級指針
//主函數調用該函數時,把指針p1的地址作爲實參傳給了myp1,相當於 myp1=&p1;
int getMem2( char **myp1, int *mylen1, char **myp2, int *mylen2 )
{
    int ret = 0;
    char *tmp1,*tmp2;
    tmp1 = (char *)malloc(100);
    strcpy(tmp1,"123456789");

    //間接賦值
    *mylen1 = strlen(tmp1); //1級指針
    *myp1 = tmp1;   //2級指針

    tmp2 = (char *)malloc(200);
    strcpy(tmp2,"asdsffffdf");

    //間接賦值
    *mylen2 = strlen(tmp2); //1級指針
    *myp2 = tmp2; //2級指針
    printf("tmp2:%s\n",tmp2);
    printf("*myp2:%s\n",*myp2);
    return ret;
}

void main()
{
    int ret = 0;
    char    *p1 = NULL;  //1級指針
    int     len1 = 0;
    char    *p2 = NULL; //2級指針
    int     len2 = 0;
    char    **p3 = NULL;

    p1=0x11;
    p3=0x22;

    //直接修改p1的值
    p1 = 0x111;

    //間接修改p1的值
    p3 = &p1;
    *p3 = 100;  //間接賦值,p3是p1的地址
    printf("p1:%d\n",p1);  //打印的是指針變量p1的值,而不是p1指向的內存空間,因爲還沒有分配空間,打印會宕機

    {
        *p3 = 200;  //間接賦值,p2是p1的地址
        printf("p1:%d\n",p1);  //打印的是指針變量p1的值,而不是p1指向的內存空間,因爲還沒有分配空間,打印會宕機

    }

    getMem(&p1);
    printf("p1:%d\n",p1);  //打印的是指針變量p1的值,而不是p1指向的內存空間,因爲還沒有分配空間,打印會宕機

    getMem2(&p1,&len1,&p2,&len2);
    if( 0 != ret )
    {
        printf("func getMem2() err:%d\n",ret);
        return ret;
    }
    printf("p1:%s, len1:%d, p2:%s, len2:%d\n",p1,len1,p2,len2);

    //釋放函數getMem2中分配的內存空間(即主函數中p1、p2所指向的內存空間)
    if( NULL != p1 )
    {
        free(p1);
        p1=NULL;
    }
    if( NULL != p2 )
    {
        free(p2);
        p2=NULL;
    }

    system("pause");
    return;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章