函数参数为指针时的情况分析:
1)实参已经初始化
例如:
char ch[1024];
int* func(char *p)
{
memcpy(p,"hello");
}
//函数调用:
func(ch);
分析:实参已经被初始化了,即:指针ch已经指向了内存空间。
2)实参未初始化或着值为NULL。
错误写法:
//错误写法
char *ch;
int* func(char *p)
{
p = (char*)malloc(sizeof(char)*5);
p[0]='h';
}
//函数调用:
func(ch);
//此时因为ch没有初始化,所以函数传递属于值传递,这样并不能给实参初始化。
改正方法一:采用传引用的方式,而不是值传递的方式
char *ch;
int* func(char* &p)
{
p = (char*)malloc(sizeof(char)*5);
p[0]='h';
}
//函数调用:
func(ch);
改正方法二:采用指针传递,而不是值传递,因为实参本身是指针,所以函数参数可以为二重指针
char *ch;
int* func(char** p)
{
*p = (char*)malloc(sizeof(char)*5);
(*p)[0]='h';
}
//函数调用:
func(&ch);
实参为NULL的情况
//实参虽然出事话为NULL了,仍然不能直接使用//因为指针仍然没有指向内存
char *ch=NULL;
int* func(char*p)
{
if(!ch)
printf("error");
}
//函数调用:
func(ch);
总结:
如果函数形参要通过指针传递,且该指针没有初始化,则要么采用(二重)指针的形式,要么采用引用的形式进行参数初始化;
如果实参指针已经初始化了,则可以直接通过值传递即可。
另,参考示例可以参看本文。