文字列とポインタ

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
tomo.xxx

文字列とポインタ

#1

投稿記事 by tomo.xxx » 12年前

こんばんは
初めて投稿させていただきます。
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;
}
よろしくお願いします。

Priest
記事: 123
登録日時: 12年前
住所: 愛知

Re: 文字列とポインタ

#2

投稿記事 by Priest » 12年前

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

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

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

コード:

int *a;

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

コード:

#include <Priest.h>
int MyPolicy ( void ) { printf( "何事も楽しくね!" ); return 0; }

tomo.xxx
記事: 13
登録日時: 12年前

Re: 文字列とポインタ

#3

投稿記事 by tomo.xxx » 12年前

素早い返信ありがとうございます。
おっしゃる通り、宣言のときの*と、代入の時の*で混乱しているみたいです。

今、②番のところを

コード:

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

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

Priest
記事: 123
登録日時: 12年前
住所: 愛知

Re: 文字列とポインタ

#4

投稿記事 by Priest » 12年前

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

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

コード:

#include <Priest.h>
int MyPolicy ( void ) { printf( "何事も楽しくね!" ); return 0; }

tomo.xxx
記事: 13
登録日時: 12年前

Re: 文字列とポインタ

#5

投稿記事 by tomo.xxx » 12年前

またしても素早い回答ありがとうございます。

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

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

Priest
記事: 123
登録日時: 12年前
住所: 愛知

Re: 文字列とポインタ

#6

投稿記事 by Priest » 12年前

ポインタは難しいですからね。頑張ってください。

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

コード:

#include <Priest.h>
int MyPolicy ( void ) { printf( "何事も楽しくね!" ); return 0; }

tomo.xxx
記事: 13
登録日時: 12年前

Re: 文字列とポインタ

#7

投稿記事 by tomo.xxx » 12年前

頑張ってみます

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

閉鎖

“C言語何でも質問掲示板” へ戻る