#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;
}
通過2級指針改變1級指針的指向
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.