c言語-ポインタを関数パラメータとする

3398 ワード

void readlines(char *p)
{
    if(p != NULL)
  {
    while((*p++ = getchar()) != '
')
      ;
    *(--p) = '\0';
  }
} int main() { char s[20]; readlines(s); return 0; }

ポインタパラメータsはアドレスを入力し、プログラムはsが指すアドレス空間を操作することができる.
次のルーチンの目的は、サブルーチンの文字列をメインプログラムの文字配列にコピーすることであるが、以下のコードでは目的を達成できない.
int readlines(char *p)
{
    printf("p    %d
", &p); printf("p %d
", p); char st[] = "hello, world"; printf("st %d
", st); p = st; printf("p %d
", p); } int main() { char s[20]; char *pt = s; printf("pt %d
", &pt); printf("pt %d
", pt); readlines(pt); printf("pt %d
", pt); return 0; }

 
 
プログラム実行の結果、ptが指すアドレスは2293536であった.
pが指すアドレスは2293536である.
stが指すアドレスは2293456である.
pが指すアドレスは2293456である.
ptが指すアドレスは2293536である.
pの値は変化し,ptの値は変化しないことがわかる.ptは伝達値のみであり,サブプログラムによってptの値,すなわちptが元のアドレス空間を指すかを変えることはできない.
ptのアドレスは2293532です.
pのアドレスは2293472です.
従って,pはサブルーチンの局所変数であり,p値の変化はptの変化を意味しない.
転載先:https://www.cnblogs.com/zqiang3/archive/2012/12/09/2810158.html