ページ 11

文字列とポインタ

Posted: 2013年2月14日(木) 00:41
by tomo.xxx
こんばんは
初めて投稿させていただきます。
tomo.xxxです。

今回こちらのサイト(http://www.orchid.co.jp/computer/cschoo ... tml#string)を使ってC言語の文字列とポインタを改めて勉強しようと思って作成したのですが、無限ループの中の処理の②の部分

if(*(str + i) == src){
*(str + i) = dst;
}

の *(str + i) = dst というのはdstのアドレスを*(str + i)に入れているのでしょうか?
それともdstの中身 '-' を ' '(空白)に入れているのでしょうか?

質問が良くわからないかもしれませんが、どなたか教えていただけると幸いです。


ちなみにプログラムは空白に'-'を代入するというプログラムです。

出力結果
abc-def-ghi

コード:

#include <stdio.h>

int main(void)
{
  char result[100]; // 出力結果を入れる配列
  char *str, src, dst;
  int i = 0;

  src = ' '; 
  dst = '-'; 
  str = "abc def ghi";
  
  while(1){
    // 文字列の終端にきたらループを抜ける・・・①
    if(*(str + i) == '\0'){
      break;
    }
    // 文字がsrcだったらdstに上書きする・・・②
    if(*(str + i) == src){
      *(str + i) = dst;
    }
    // 結果を保存する・・・③
    result[i] = *(str + i);
    i++;
  }

  // 結果を出力する
  puts(result);

  return 0;
}
よろしくお願いします。

Re: 文字列とポインタ

Posted: 2013年2月14日(木) 01:10
by Priest
tomo.xxx さんが書きました: *(str + i) = dst というのはdstのアドレスを*(str + i)に入れているのでしょうか?
それともdstの中身 '-' を ' '(空白)に入れているのでしょうか?
dstの中身 '-' を str+iが指すアドレスの中身にいれています。

ポインタ型として宣言された変数の代入の際には:
*がついている時は、そのポインタが差すアドレスの中身に代入します。
ついていない時は、そのポインタが持つアドレス値に代入します。

宣言のときの*と、代入の時の*で混乱するかもしれませんが…。

コード:

int *a;

a=3; // aは3番地を指すようになる
*a=3; // aの指すアドレスの中身に3を代入する

Re: 文字列とポインタ

Posted: 2013年2月14日(木) 01:35
by tomo.xxx
素早い返信ありがとうございます。
おっしゃる通り、宣言のときの*と、代入の時の*で混乱しているみたいです。

今、②番のところを

コード:

if(*(str + i) == src){
      *(str + i) = &dst;
    }
このようにしたところ
警告: assignment makes integer from pointer without a cast
という警告が出たのですが、これは(str + i)が指すアドレスの中身にdstのアドレスを代入しようとするから警告が出るのでしょうか?

立て続けに申し訳ありません。

Re: 文字列とポインタ

Posted: 2013年2月14日(木) 01:45
by Priest
tomo.xxx さんが書きました:このようにしたところ
警告: assignment makes integer from pointer without a cast
という警告が出たのですが、これは(str + i)が指すアドレスの中身にdstのアドレスを代入しようとするから警告が出るのでしょうか?
そうですね。
普通に使っていればそんなことはする必要はありませんけど、コード文法的には間違っていないので、
エラーは吐かない感じです。

それに、str+iはchar型(1byte)ですので、代入しようとするとdstのアドレス値が大きすぎて値が維持できない可能性が高いですね。

Re: 文字列とポインタ

Posted: 2013年2月14日(木) 02:04
by tomo.xxx
またしても素早い回答ありがとうございます。

なるほど、勉強になります。
改めてポインタについてもう少し深く勉強してみようと思います。

回答していただきありがとうございました。

Re: 文字列とポインタ

Posted: 2013年2月14日(木) 02:07
by Priest
ポインタは難しいですからね。頑張ってください。

一件落着でしたら、解決!ボタンを押しておいてくださいね!

Re: 文字列とポインタ

Posted: 2013年2月14日(木) 02:10
by tomo.xxx
頑張ってみます

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