C言語関係掲示板

過去ログ

No.449.char *型変数q に、配列strのアドレスを設定

[戻る] [ホームページ]
No.3216

char *型配列の扱い方
投稿者---yumi(2002/10/29 18:54:41)


こんにちは。
char *型の変数の扱いについて、分からないことがあったので教えて下さい。
以下のサンプルは、「char *型変数q に、配列strのアドレスを設定」するつもりで書きました。
しかし、qの中身をprintfしようとすると、エラーが発生してしまいます。
どこが誤っているのか、指摘していただければ幸いです。


#include <string.h>
#include <stdio.h>

void SetValue( char *p, char *q, char *str, char *pName );

void main( void )
{
char str[128];
char pName[128];
char *p;
char *q;

strcpy( str,"テスト\n" );
p = str;

SetValue( p, q, str, pName );

printf( "pName = %s\n", pName );
printf( "p= %s\n", p );
printf( "q= %s\n", q );
return;
}

void SetValue( char *p, char *q, char *str, char *pName )
{
q = str;
strcpy( pName, q );
}


No.3217

Re:char *型配列の扱い方(関数でポインタの指す先を変える)
投稿者---kikk(2002/10/29 21:51:11)


ども。


以下を参考にしてください。

void f(int x) {
/* x == 0 */
x=1;
/* x == 1 */
}

void g() {
int x=0;
/* x == 0 */
f(x);
/* x == 0 */
}

としたとき、f()のxとg()のxは別物です。
ポインタでもこのことは変わりません。

void f(char *p) {
/* p == 無効なアドレス(g()のpが指しているアドレスと同じ) */
p="string";
/* p == 文字列"string"が格納されているアドレス */
}

void g() {
char *p;
/* p == 無効なアドレス */
f(p);
/* p == 無効なアドレス */
}


たぶんタイトルにかっこで書いたようなことをやりたいと思うのですが、
その場合は以下のようにします。

void f(char **p) { /* 変数名はpじゃなくpp等のほうがいいかも */
/* p == g()のp自身のアドレス(!= g()のpが指しているアドレス) */
/* *p == 無効なアドレス(== g()のpが指しているアドレス) */
/* **p == g()のpが指している無効なアドレスの内容(ゴミ) */
*p="string";
/* p == g()のp自身のアドレス(変化なし) */
/* *p == 文字列"string"が格納されているアドレス */
/* **p == 's' */
}

void g() {
char *p;
/* p == 無効なアドレス */
f(&p);
/* p == 文字列"string"が格納されているアドレス */
/* *p == 's' */
}


なお、

type **x; /* xをtype型のポインタのポインタ型の変数として宣言 */
type *y; /* yをtype型のポインタ型の変数として宣言 */
type z; /* zをtype型の変数として宣言 */

と宣言されていたとき、式中において

&x type型のポインタのポインタのポインタ型(滅多に使うことはないけど)
x type型のポインタのポインタ型
*x type型のポインタ型
**x type型

&y type型のポインタのポインタ型
y type型のポインタ型
*y type型

&z type型のポインタ型
z type型

です。


では。

No.3218

Re:char *型配列の扱い方
投稿者---pia(2002/10/29 22:12:03)



main() で宣言している q と SetValue() の引き数で指定している q
は別物ですよね。いくら SetValue() 内で q = str として q に str
のアドレスを設定しても、 main() の q のさしているアドレスが変わる
ものではありません。
SetValue() 内の q にはアドレスが設定されますが、main() で宣言している
q には何ら変わりはないはずです。
多分、q = str ではなく、strcpy(q, str) だとうまく行くと思います。
これだと意味ないのかな?

って間違ってたら超ごめんなさいね。