ポインターとしてのC言語関数パラメーターの分析

関数パラメーターがポインターである場合の状況の分析:

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);

まとめ

関数パラメーターがポインターを介して渡されることになっていて、ポインターが初期化されていない場合、(二重)ポインター形式または参照形式のいずれかがパラメーターの初期化に使用されます。

実際のパラメータポインタが初期化されている場合は、値で直接渡すことができます。

また、参考例については、この記事を参照してください

 

 

おすすめ

転載: blog.csdn.net/modi000/article/details/113969352