関数パラメーターがポインターである場合の状況の分析:
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没有初始化,所以函数传递属于值传递,这样并不能给实参初始化。
修正方法1:値で渡す代わりに参照で渡す方法を使用する
char *ch;
int* func(char* &p)
{
p = (char*)malloc(sizeof(char)*5);
p[0]='h';
}
//函数调用:
func(ch);
修正方法2:実際のパラメーター自体がポインターであり、関数パラメーターが二重ポインターになる可能性があるため、値転送の代わりにポインター転送を使用します
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);
まとめ:
関数パラメーターがポインターを介して渡されることになっていて、ポインターが初期化されていない場合、(二重)ポインター形式または参照形式のいずれかがパラメーターの初期化に使用されます。
実際のパラメータポインタが初期化されている場合は、値で直接渡すことができます。