C言語関係掲示板

過去ログ

No.201.ポインタと文字列



No.1260

「10-3 ポインタと文字列」のポインタの質問
投稿者---アソ(2002/03/15 18:22:26)


http://www9.plala.or.jp/sgwr-t/sec10.htm
のページの上のほうに
1. char  *p = "ABC";

2. char  *p;
    p = "ABC";

 で1と2は同じことと書いてありますが
どのような考え方をするといいのでしょうか?
できれば、詳しくお願いします。


No.1262

Re:「10-3 ポインタと文字列」のポインタの質問
投稿者---ともじ(2002/03/15 22:00:36)


こんばんは。

>1. char  *p = "ABC";
>
>2. char  *p;
>    p = "ABC";
>
> で1と2は同じことと書いてありますが
>どのような考え方をするといいのでしょうか?

1. int a = 10;
2. int a;
   a = 10;

上記の1、2が処理的には同じになることはわかりますよね。

1. char  *p = "ABC";
2. char  *p;
    p = "ABC";

これも同じことで、1ではポインタの宣言と"ABC"のアドレスの
ポインタへの設定を1ステップで同時に記述し、
2では2ステップに分けて記述しています。



No.1264

Re:「10-3 ポインタと文字列」のポインタの質問
投稿者---アソ(2002/03/16 00:08:17)


 ありがとうございました。

>1. int a = 10;
>2. int a;
>   a = 10;
>
>上記の1、2が処理的には同じになることはわかりますよね。

 はい。

>1. char  *p = "ABC";
>2. char  *p;
>    p = "ABC";
>
>これも同じことで、1ではポインタの宣言と"ABC"のアドレスの
>ポインタへの設定を1ステップで同時に記述し、
>2では2ステップに分けて記述しています。

 記述の仕方が、気持ち悪いです。
2の式が
char *p;
*p = "ABC";
 だったら、スッキリするんですが。


No.1265

Re:「10-3 ポインタと文字列」のポインタの質問
投稿者---ともじ(2002/03/16 00:27:45)


> 記述の仕方が、気持ち悪いです。
>2の式が
>char *p;
>*p = "ABC";
> だったら、スッキリするんですが。

最初に混同しやすい個所ですが、「*p」は宣言と実行文では意味が異なります。
宣言の「*p」は「ポインタを宣言する」という意味になります。
実行文での「*p」は「ポインタpが格納しているアドレスが指す中身」の意味
になります。
ですから、*p="ABC"とすると、ポインタpにはアドレスが設定されておらず、
不定になっているが、その不定のアドレスが指す中身に"ABC"のアドレス
を代入することになってしまいまい、コンパイル時に警告が出ます。
無理に実行すると、運が悪いと暴走してしまいます。


No.1389

Re:「10-3 ポインタと文字列」のポインタの質問
投稿者---あかま(2002/04/05 15:42:25)


はじめまして。
ちょっと気になることがあるので便乗して質問させてください。

char str[ ] = "ABC";
こう記述したときはコンパイラが文字列"ABC"の長さを計算して
メモリ領域を確保、その領域に"ABC"を格納して、
以後その領域は配列str[ ]として呼び出すことができますよね。
では

char  *p = "ABC";

と記述したとき、pはポインタなのでメモリ領域はどうするのかなと考えた次第です。
上記と同じようにコンパイラが自動的にメモリ領域を確保、文字列"ABC"を格納して
そのアドレスをポインタpに格納してくれると考えてよいのでしょうか?

またその場合、pに別のアドレスを代入すると"ABC"のアドレスがわからなくなって行方不明になると考えてもよいでしょうか?

質問は以上です。よろしくお願いします。

No.1394

Re:「10-3 ポインタと文字列」のポインタの質問
投稿者---ともじ(2002/04/06 00:28:12)


こんばんは。

>char str[ ] = "ABC";
>こう記述したときはコンパイラが文字列"ABC"の長さを計算して
>メモリ領域を確保、その領域に"ABC"を格納して、
>以後その領域は配列str[ ]として呼び出すことができますよね。
>では
>
>char  *p = "ABC";
>
>と記述したとき、pはポインタなのでメモリ領域はどうするのかなと考えた次第です。
>上記と同じようにコンパイラが自動的にメモリ領域を確保、文字列"ABC"を格納して
>そのアドレスをポインタpに格納してくれると考えてよいのでしょうか?

そう考えていいと思います。ただ、後者の場合、コンパイラがメモリ領域を
確保するのは、ポインタの領域と文字列リテラルの領域の両方になります。

>またその場合、pに別のアドレスを代入すると"ABC"のアドレスがわからなくなって行方不明になると考えてもよいでしょうか?

そういうことになりますね。


No.1395

Re:「10-3 ポインタと文字列」のポインタの質問
投稿者---あかま(2002/04/06 01:25:35)


質問に答えていただいてありがとうございました。

なにやらコンパイラの仕様を理解するのもCの勉強に必要そうですね。
すこしその辺も勉強してみようと思います。
またいずれ質問させていただく機会があると思いますが、よろしくお願いします。

No.1396

追記
投稿者---ともじ(2002/04/06 10:09:42)


メモリ領域の確保の仕方について追記しておきます。

 char str[ ] = "ABC"; ・・・(1)
 char *p = "ABC";   ・・・(2)

(1)の配列の場合は自動変数として宣言した場合には、メモリ上の
スタック領域に領域が確保され、静的変数、外部変数として宣言した場合には
メモリ上の読み書き可能な静的領域に確保されます。

(2)の文字列リテラルの場合は、処理系に依存しますがメモリ上の
読み取り専用の静的領域に確保される場合があります。
この場合、
 *p = 'a';
のように、中身を書き換えようとすると、異常終了してしまいます。
ですから、(2)の場合は参照のみにとどめ、書き換えが必要な場合には
(1)の配列で宣言する必要があります。


戻る


「初心者のためのポイント学習C言語」 Last modified:2002.05.26
Copyright(c) 2000-2002 TOMOJI All Rights Reserved