質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

Q&A

解決済

3回答

242閲覧

文字列とポインタについて(コード短いです)

ssspwp

総合スコア31

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

0グッド

0クリップ

投稿2017/11/03 05:13

#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ページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

C言語での文字列は、「連続するcharの一群」という形で表されています。連続したメモリを走査する必要がある以上、ポインタ自体を渡す必要があります。

*strとすると、1文字だけが取れてしまって、残りの文字を取得する方法がなくなってしまいます。

投稿2017/11/03 05:25

maisumakun

総合スコア145183

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ssspwp

2017/11/05 16:58

【実行結果】 文字列はHelloです。 文字列strのアドレスは00AA7B48です。  "Hello"のアドレスは00AA7B48ですか? 『連続したメモリを走査する』とはどういう意味でしょうか? すいません、質問ばっかで(-_-;)
guest

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
LouiS0616

総合スコア35660

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ssspwp

2017/11/05 16:50

*pt==str[0]=='H' *(pt+1)==str[1]=='e' 略 *(pt+5)==str[5]=='\0' で"Hello"と表示されるのは理解できます。 ただ、いまいち自分の疑問点とリンクしないです
LouiS0616

2017/11/05 17:10

printf("文字列は%sです。\n", *str); とかくと、 printf("文字列は%sです。\n", 'H');、つまりprintf("文字列は%sです。\n", 72); と解釈されるということです。
LouiS0616

2017/11/05 17:12

ヌル終端文字列を扱う上では、連続した領域に文字があって、その末尾がヌルであるという事実が大切なのです。 一文字一文字はただの数値で、それ以上の意味はありません。
LouiS0616

2017/11/05 18:03

一文字一文字のアドレスが別個であることがわかるよう追記しました。
ssspwp

2017/11/06 08:26

添字要素を伴わない配列名は、その先頭要素のアドレスを表している。 すなわち、str==&str[0]で strはアドレスであって"Hello"そのものではないのに、書式指定を%sに変えるだけでなんで"Hello"がでてくるのかが理解できなかったのですが『書式指定子%sは、文字列の先頭アドレスを受け取ったとき、ヌル文字まで表示するもの』だから、strでいいんですね。
LouiS0616

2017/11/06 08:40

その通りです。 ポインタの挙動を理解していると他の言語を勉強する際にも強みになります。頑張ってくださいね。
ssspwp

2017/11/06 17:20

そうなんですね!やる気がわいてきました!ありがとうございます(*'ω'*)
guest

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
A.Ichi

総合スコア4070

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

A.Ichi

2017/11/03 10:25

先ほど気か付きまして、簡単ですがお答えを記述しました。ご指摘ありがとうございます。
ssspwp

2017/11/05 16:35

printf("先頭文字は%cです。\n", *str); これは、strは配列の先頭要素のアドレスを示すから,*をつけると *str=str[0]='H'ということでしょうか?
A.Ichi

2017/11/05 22:49

*str=str[0]='H'となります。コードにも付け加えました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問