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

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

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

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

Q&A

解決済

3回答

774閲覧

ポインタの位置関係について

gyoruo

総合スコア61

C

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

0グッド

0クリップ

投稿2020/04/22 07:45

Cの絵本に書かれていたサンプルコードなのですが、 printf("%d文字列目で発見しました。\n", p-s+1);のp-s+1の部分がわかりません。pは、ポインタで後々にp++;がされていることからs[]の文字数ー現在のポインタの位置数であるpを引いて+1なら理解できるのですが(s-p+1)、なぜ(p-s+1)とやれば正しい結果が返ってくるのでしょうか?

C

1#include <stdio.h> 2 3main() { 4 char s[] = "I love cat and dog."; 5 char c = 'a'; 6 char *p = s; 7 int n = 0; 8 9 printf("%sの中から%cを探します\n", s, c); 10 while(*p != '\0') { 11 if(*p == c) { 12 printf("%d文字列目で発見しました。\n", p-s+1); 13 n++; 14 } 15 p++; 16 } 17 if(n == 0) 18 printf("1つも見つかりませんでした。\n"); 19 else 20 printf("全部で%d個見つかりました。\n", n); 21} 22

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

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

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

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

guest

回答3

0

ベストアンサー

sは文字数ではなく文字列の一文字目のポインタを表します。
pは現在の文字のポインタです。
仮にsのアドレスが100でpが102ならp-s+1=3で3文字目と表示されます。
例えば s = "Hello" に対して

100: 'H' <- s 101: 'e' 102: 'l' <- p 103: 'l' 104: 'o'

と対応するようなイメージです。

投稿2020/04/22 07:53

編集2020/04/22 07:58
kairi003

総合スコア1330

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

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

gyoruo

2020/04/22 07:58

わかりやすいご回答ありがとうございました!
guest

0

例えば1文字目の場合、p-s0です。
0開始でのn番目で見つかったものを1開始の〇文字目とするため+1してやる必要があります。

投稿2020/04/22 07:51

編集2020/04/22 07:55
SHOMI

総合スコア4079

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

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

gyoruo

2020/04/22 07:59

pはI文字目のポインタを指しているということで理解できました。ありがとうございます!
guest

0

同じ型のポインタ通しであれば引き算して2つのポインタの距離を求めることができます
ということで、p-s で、見つかった文字の先頭からの位置を求めることができます

投稿2020/04/22 07:48

y_waiwai

総合スコア87747

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

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

gyoruo

2020/04/22 07:55

ご回答ありがとうございます。 ということは、sが10(配列の文字数)だとしてpが5だとした場合は、-5になりますが、距離を求めているので-5ではなく、5になるということでしょうか?
y_waiwai

2020/04/22 08:01

配列であれば、その名前を出してくることで、先頭のアドレスを表します s は、そのサイズがどうあれその配列の先頭のアドレスを示します で、 p=s で、pは配列の先頭のアドレスを代入され、p++ で、1文字分加算され、p-s は1となる、ってことです #わかるかなー。。
gyoruo

2020/04/23 05:57

ご回答ありがとうございます。 理解できました! ありがとうございます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問