#include<stdio.h> int main() { char *str = "Hello"; printf("文字列は%sです。\n", str);① printf("文字列strのアドレスは%pです。\n", str);② return 0; }
①番のstrはアドレスを表していて、*をつけることによってそのアドレスに格納されている値を指すことができる。
実際に②番で確認済み
だとしたら、①はprintf("文字列は%sです。\n", *str);
こう書くべきではないんですか?
あと、
(ポインタ=アドレスを格納する変数) という解釈で間違いないですか?
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答3件
0
C言語での文字列は、「連続するchar
の一群」という形で表されています。連続したメモリを走査する必要がある以上、ポインタ自体を渡す必要があります。
*str
とすると、1文字だけが取れてしまって、残りの文字を取得する方法がなくなってしまいます。
投稿2017/11/03 05:25
総合スコア145183
0
ベストアンサー
strはchar型配列のポインタとして振舞います。
ですので、ポインタの参照先はあくまでもchar型の値です。
具体的に言うと、以下のようなコードを書けます。
C
1for(char *pt = str; *pt != '\0'; pt++) { 2 printf("%c", *pt); 3} 4printf("\n");
書式指定子%sは、文字列の先頭アドレスを受け取ったとき、ヌル文字まで表示するものです。
ですから、渡す値はポインタのままで構いません。
(ポインタ=アドレスを格納する変数) という解釈で間違いないですか?
問題ないです。
追記
C
1#include<stdio.h> 2 3int main() 4{ 5 char *str = "Hello"; 6 7 printf("%s, adress: %p\n", str, str); 8 for(char *pt = str; *pt != '\0'; pt++) { 9 printf("%5c, adress: %p\n", *pt, pt); 10 } 11 printf("\n"); 12 13 return 0; 14}
実行結果
Hello, adress: 00405064 H, adress: 00405064 e, adress: 00405065 l, adress: 00405066 l, adress: 00405067 o, adress: 00405068
**『ヌル終端しているから、先頭の文字のアドレスを文字列のアドレスとみなせる』**んです。
一文字一文字アドレスは別個です。
投稿2017/11/03 05:24
編集2017/11/05 18:05総合スコア35660
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2017/11/05 17:10
2017/11/05 17:12
2017/11/05 18:03
2017/11/06 08:26
2017/11/06 08:40
2017/11/06 17:20
0
char *str = "Hello"; 文字のポインターstrを定義し、文字列"Hello"の先頭アドレスが入りますの意味です。
printf("文字列は%sです。\n", *str); とすると4バイトのアドレスの値として扱かわれエラー(アドレス例外)になると思われます。
#include<stdio.h> int main() { char * str = "Hello"; printf("文字列は%sです。\n", str); printf("先頭文字は%cです。\n", *str); printf("二番目文字は%cです。\n", str[1]); printf("文字列strのアドレスは%pです。\n", str); return 0; }
C
1#include<stdio.h> 2 3int main() 4{ 5 char str[10] = "Hello"; 6 7 printf("文字列は%sです。\n", str); 8 printf("先頭文字は%cです。\n", *str); 9 printf("二番目文字は%cです。\n", str[1]); 10 printf("文字列strのアドレスは%pです。\n", str); 11 12 return 0; 13}
投稿2017/11/03 10:12
編集2017/11/05 22:58総合スコア4070
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2017/11/03 10:25 編集
2017/11/03 10:25
2017/11/05 16:35
2017/11/05 22:49
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2017/11/05 16:58