1.如果是函數內進行內存申請,很簡單,標準用法就可以了:
test()
{
?int *array;
?
?array=(int *)malloc(sizeof(int)*10);//申請10*4 bytes,即10個單位的int內存單元
}
注意,malloc使用簡單,但是注意參數和返回值,參數是申請內存的字節數,多字節的類型如int,short,float等需要乘上類型字節數,返回值是沒有定義類型的指針,使用時需要自己指定。
2.使用一級指針實現內存申請,通過函數返回值帶出malloc的地址:
char *my_malloc(int m)
{
?char *p;
?p=malloc(m);
?return p;
}
test()
{
?char * buff=NULL;? //指針如果在函數內沒有賦值,注意開始賦值為NULL
?
?buff=my_malloc(10);
?printf("buff adress is %x\n",buff);
?free(buff);?
}
3.使用二級指針實現內存申請,通過指針值傳遞:
void my_malloc1(char **p1)
{
? *p1=(char *)malloc(100);
}
test()
{
?char *buffer=NULL;
?
?my_malloc1(&buffer);
?printf("buffer adress is %x\n",buffer);
?free(buffer);
}
小結:一級指針和二級指針在做形參時的不同:指針用作形參,改變指針地址則值不能傳回,改變指針內容而地址不變則值可以傳回。(特殊情況:改變指針地址采用返回值也可以傳回地址)
對于 一級指針,做形參時傳入地址,如果函數只改變該指針內容,OK,該指針可以正常返回; 如果函數改變了指針地址,除非返回該指針,否則該指針不能正常返回,函數內對指針的操作將無效。
對于 二級指針, 做形參時傳入地址(注意此時傳入的是二級指針的地址),如果改變該二級指針地址(**p),對該指針的操作也將無效, 但是改變二級指針的內容(例如*p),則該二級指針可以正常返回。
總之,指針使用最關鍵的是弄清地址和內容,指針做 形參時只有改變其內容時才能正常返回。
?
4.編程實例:
/*
date:20100823
file name:my_pointer.c
description:指針作為形參的值傳遞分析
result:
1.指針作為形參時,如果只需要改變指針指向的值,可以使用一級指針,如果需要改變指針本身的地址
,則需要使用二級指針,相當于改變的是一級指針指向的值。
2.指針作為形參時,指針指向的內容變化是可以帶回的,指針地址的變化是不可帶回的,即指針作為參
數,其地址不可改變,否則形參就無法傳回實參的值。
*/
/*********************************************************************************/
//指針作為形參,指針指向的內容改變,函數返回時這種變化是可以帶回的
void change(int *p)
{
?*p+=5;
}
test1()?
{
?int a=1;
?
?change(&a);
?
?printf("After change a is %d\n",a);? //結果為6
}
/*********************************************************************************/
//指針作為形參,指針本身的地址改變,函數返回時這種變化將無效
void my_malloc(char *pp,int num)??
{
?pp=(char *)malloc(num);
}
test2()??????
{
?char *buf=NULL;
?
?my_malloc(buf,100);
?
?printf("After my_malloc buf adress is %x\n",buf); //函數返回后,buf的地址依然為NULL
?strcpy(buf,"hello");???????? //這里會出錯,運行出現段錯誤,程序直接退出了,下面的輸
出也沒有了
?puts(buf);
}
main()
{
?test1();
?//test2();
}?
?
test()
{
?int *array;
?
?array=(int *)malloc(sizeof(int)*10);//申請10*4 bytes,即10個單位的int內存單元
}
注意,malloc使用簡單,但是注意參數和返回值,參數是申請內存的字節數,多字節的類型如int,short,float等需要乘上類型字節數,返回值是沒有定義類型的指針,使用時需要自己指定。
2.使用一級指針實現內存申請,通過函數返回值帶出malloc的地址:
char *my_malloc(int m)
{
?char *p;
?p=malloc(m);
?return p;
}
test()
{
?char * buff=NULL;? //指針如果在函數內沒有賦值,注意開始賦值為NULL
?
?buff=my_malloc(10);
?printf("buff adress is %x\n",buff);
?free(buff);?
}
3.使用二級指針實現內存申請,通過指針值傳遞:
void my_malloc1(char **p1)
{
? *p1=(char *)malloc(100);
}
test()
{
?char *buffer=NULL;
?
?my_malloc1(&buffer);
?printf("buffer adress is %x\n",buffer);
?free(buffer);
}
小結:一級指針和二級指針在做形參時的不同:指針用作形參,改變指針地址則值不能傳回,改變指針內容而地址不變則值可以傳回。(特殊情況:改變指針地址采用返回值也可以傳回地址)
對于 一級指針,做形參時傳入地址,如果函數只改變該指針內容,OK,該指針可以正常返回; 如果函數改變了指針地址,除非返回該指針,否則該指針不能正常返回,函數內對指針的操作將無效。
對于 二級指針, 做形參時傳入地址(注意此時傳入的是二級指針的地址),如果改變該二級指針地址(**p),對該指針的操作也將無效, 但是改變二級指針的內容(例如*p),則該二級指針可以正常返回。
總之,指針使用最關鍵的是弄清地址和內容,指針做 形參時只有改變其內容時才能正常返回。
?
4.編程實例:
/*
date:20100823
file name:my_pointer.c
description:指針作為形參的值傳遞分析
result:
1.指針作為形參時,如果只需要改變指針指向的值,可以使用一級指針,如果需要改變指針本身的地址
,則需要使用二級指針,相當于改變的是一級指針指向的值。
2.指針作為形參時,指針指向的內容變化是可以帶回的,指針地址的變化是不可帶回的,即指針作為參
數,其地址不可改變,否則形參就無法傳回實參的值。
*/
/*********************************************************************************/
//指針作為形參,指針指向的內容改變,函數返回時這種變化是可以帶回的
void change(int *p)
{
?*p+=5;
}
test1()?
{
?int a=1;
?
?change(&a);
?
?printf("After change a is %d\n",a);? //結果為6
}
/*********************************************************************************/
//指針作為形參,指針本身的地址改變,函數返回時這種變化將無效
void my_malloc(char *pp,int num)??
{
?pp=(char *)malloc(num);
}
test2()??????
{
?char *buf=NULL;
?
?my_malloc(buf,100);
?
?printf("After my_malloc buf adress is %x\n",buf); //函數返回后,buf的地址依然為NULL
?strcpy(buf,"hello");???????? //這里會出錯,運行出現段錯誤,程序直接退出了,下面的輸
出也沒有了
?puts(buf);
}
main()
{
?test1();
?//test2();
}?
?