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