C言語ポインタは形参としてのいくつかの問題である.

1467 ワード

ポインタは形参として具体的な原理が分からないことが多いに違いありません.私も最近いくつかの道を知りました.
以下、いくつかの例を用いて説明します.
void myMalloc(char *s) //          ,    
{ 
    s=(char *) malloc(100); 
} 
void main() 
{ 
    char *p=NULL; 
    myMalloc(p); //   p    NULL,      100    ,   ? 
    if(p) 
       free(p);
} 
 基于上面的问题: 因为指针作为形参传递过去的是它的拷贝,只是说他们指向同一块内存地址。 
   
  

    上面其实是给他的拷贝体进行了内存地址分配

void myMalloc(char **s) 
{ 
    *s=(char *) malloc(100); 
} 
void main() 
{ 
    char *p=NULL; 
    myMalloc(&p); //   p          
    if(p) free(p); 
} 

ここでどうして正しい値が得られるのですか? 
ここで形参が割り当てたメモリは実はs自体に割り当てられているので、上に割り当てるときに使います(*s)
#include 
void fun(int *p) 
{ 
    int b=100; 
    p=&b; 
} 
main() 
{ 
    int a=10; 
    int *q; 
    q=&a; 
    printf("%d/n",*q); 
    fun(q); 
    printf("%d/n",*q); 
    return 0; 
} 
ここで印刷された結果は:10
どうしてですか.main関数ではqポインタが形パラメータとしてfun関数に渡されるため,fun関数ではpがqポインタのコピー体,f
fun関数のpは、関数体において整数bのアドレスを再び指す.したがってqポインタ自体の値は変化しない
#include 
void fun(int *p) 
{ 
    *p=100; 
} 
main() 
{ 
    int a=10; 
    int *q; 
    q=&a; 
    printf("%d/n",*q); 
    fun(q); 
    printf("%d/n",*q); 
    return 0; 
} 

ここで印刷した結果は:10 100
main関数のqポインタとパラメータのpポインタは整数aのアドレスを指しているので、私たちが望む結果を正しく印刷することができます.
fun関数では、実は整数aアドレスの値を修正しているので、後文でポインタqの内容を印刷する場合でも、100を印刷することができます