掲示板利用宣言

 次のフォームをすべてチェックしてからご利用ください。

 私は

 題名と投稿者名は具体的に書きます。
 課題の丸投げはしません。
 ソースの添付は「HTML変換ツール」で字下げします。
 返信の引用は最小限にします。
 環境(OSとコンパイラ)や症状は具体的に詳しく書きます。
 返信の付いた投稿は削除しません。
 マルチポスト(多重投稿)はしません。

掲示板2

管理者用メニュー    ツリーに戻る    携帯用URL    ホームページ    ログ    タグ一覧

No.26390

ポインタについて
投稿者---にゃー(2006/03/11 20:43:27)


#include <stdio.h>
int main ()
{
char *p="sakura" ;
while (*p!='\0'){
*p=*p+1 ;
p++ ;
}
printf ("%s",*p);
return 0 ;

}

とうプログラムなのですが、実行結果が(null)になってしまいます。
なぜこのような実行結果になるのかわかるかたぜひおしえてください。




この投稿にコメントする

削除パスワード

発言に関する情報 題名 投稿番号 投稿者名 投稿日時
<子記事> Re:ポインタについて 26391 にゃー 2006/03/11 20:55:59


No.26391

Re:ポインタについて
投稿者---にゃー(2006/03/11 20:55:59)


#include <stdio.h>
int main ()
{
char *p="sakura" ;
 while (*p!='\0'){
  *p=*p+1 ;
  p++ ;
  }
   printf ("%s",*p);
 return 0 ;

}



字下げを忘れていました^^;


この投稿にコメントする

削除パスワード

No.26393

Re:ポインタについて
投稿者---あかま(2006/03/11 21:09:45)


%sのとき渡すのはポインタでなくてはいけない。
>printf ("%s",*p);

printf ("%s",p);
の間違い。

それから、
p++;
とするとループから抜けた時pは\0を指している。
そのまま出力しても何も表示されないことに。

最後。文字列リテラルは変更してはいけない。
char *p="sakura";
↑こう書くと"sakura"をどこかの領域に取って、そのポインタをchar *pに格納する。
そのどこかが書き込み禁止の処理系がある(処理系依存)。なので、
char p[]="sakura";
と書かなくてはいけない。
こう書くとp[7]の領域(変更可能)を"sakura"で初期化するのでok。
このときpはポインタではなく配列なのでp++とできないことに注意。

やってることはほぼ同じだけど、細かいところで違うので注意。


この投稿にコメントする

削除パスワード

No.26394

Re:ポインタについて
投稿者---にゃー(2006/03/11 21:44:20)


ご回答ありがとうございます>m<

*pのところなのですが、なぜ%sの場合ポインタとしてでのpにしなくてはならないのでしょうか?

文字列リテラルは使ってはいけないということは、ポインタでのこのプログラムは好ましくないということだったんですね。

#include <stdio.h>
int main ()
{
char *p="sakura" ;
while (*p!='\0'){
*p=*p+1 ;
printf ("%c",*p);
p++ ;
}

return 0 ;

}

こうすれば結果がえられたのですが、配列に直してみます。


この投稿にコメントする

削除パスワード

No.26396

Re:ポインタについて
投稿者---あかま(2006/03/11 22:06:50)


>*pのところなのですが、なぜ%sの場合ポインタとしてでのpにしなくてはならないのでしょうか?

char *p="sakura";
としたとき、
pは文字列の先頭の"場所"を指しています。先頭の場所と文字列の終わりが'\0'であることが分かっていれば

//printf("%s",p)の中ではこんなことをしている
while(*p != '\0'){
    putc(*p);
    p++;
}

とすればその文字列を最初から最後まで表示できます。

しかし*pとすると先頭の"文字"です。
1文字だけでは文字列の表示はできません。
もちろん↓のように一文字ずつ渡して表示しても間違いではありません。

while (*p!='\0'){
    printf("%c",*p);//このprintfの中ではputc(c)をしているので結局上と同じ(cは引数で渡された*pとする)
    p++;
}




この投稿にコメントする

削除パスワード

No.26395

Re:ポインタについて
投稿者---iijima(2006/03/11 21:44:48)


# 横から補足で失礼します。

>> printf ("%s",*p);
> は
> printf ("%s",p);
> の間違い。

このような間違いをすると大抵はプログラムが暴走したりクラッシュしたりしますが、
にゃーさんのプログラムの場合は、printf文のところでpが文字列末尾の'\0'を指している、
つまり*pの値がたまたま0となっているので、それをヌルポインタと解釈して(null)と
表示したのだと思います。



この投稿にコメントする

削除パスワード

管理者用メニュー    ツリーに戻る    携帯用URL    ホームページ    ログ    タグ一覧