Cポインタを関数パラメータとして参照

2566 ワード

Cポインタを関数パラメータとして参照
Cではポインタを関数パラメータとして参照する例がよく見られますが、ここではよくエラーが発生します.ネット上の例を見て、例を参照して、勉強してみてください.次は間違った方法です.
void getptr(int *p,int num) {
    p=(int *)maccol(num*sizeof(int));
    return;
}
int main()
{
    int *ptr; int k;
    getptr(ptr,10);
    for(k=0;k<10;k++)
        scanf("%d",&ptr[k]);
}

このコードはptrにメモリを割り当てることはありません.ptrは値を伝える方法でpに渡されるため、pはptrのコピーであり、pは動的に割り当てられたメモリを指しますが、関数呼び出しが終わると一時変数は存在せず、動的に割り当てられたメモリも解放されず、ptrもこの動的に割り当てられたメモリを指していません.正しいコードは次のとおりです.
void getptr(int **p,int num) {
  *p=(int *)maccol(num*sizeof(int));
  //(*p)[i] = 10;   //    
  return;
}
int main()
{
    int *ptr; int k;
    getptr(&ptr,10);
    for(k=0;k<10;k++)
      scanf("%d",&ptr[k]);
}

ここでは2次ポインタを用いて実現し,関数がポインタの値ではなくポインタのアドレスを伝達する2次ポインタであることがわかり,誤った例ではgetptrにptrの値が伝達され,ptrは1つの領域を指していない.正確にはptrに入力されたアドレスであり、関数はptrのアドレスを得、*pはこのptrポインタが指す領域を表し、それによって空間を割り当てることができる.これによりptrは新しいメモリブロックを指す.
私たちはポインタのポインタを伝えてポインタの指すアドレスを変えるべきで、これは私たちが変数のポインタを伝えて変数を変えるべきことと同じ道理で、ポインタも変数なので、値を伝えるのは変数を変えることができなくて、ポインタと引用だけが変数に変化を体現することができます.
参照先:http://www.linuxidc.com/Linux/2014-01/95395.htm