アフィリエイト広告を利用しています

広告

posted by fanblog

2017年10月03日

《その64》 char*型ポインタの指すアドレス(p.314演習8-12,演習8-13)


 ポインタ s が文字列の先頭文字を指すとき、s + i は、先頭文字の i 個だけ後方の要素を指すポインタ
になります。

文字へのポインタ  文字の添字 n
1文字目 s 0
2文字目 s + 1 1
・・・
i文字目 s + i - 1 i - 1




char*型ポインタの指すアドレスを表示

int*型ポインタが指すアドレスは、例えば、
int n = 100;
cout << &n;
とすれば表示できます。

char*型の場合、int*型のときと同じように
char c = 'A';
cout << &c;
としてもうまくいきません。
そのアドレスから始まる文字列を表示してしまうからです。


この例の場合は、'A'の後に '\0'がない確率が大きいので、予期しない結果になってしまいます。


int n = 100;
char c = 'A';
cout << "int &n … " << &n << '\n';
cout << "char &c … " << &c << '\n';

c08_9001.png


別の適当な型、例えば int*型 や void*型にキャストするとうまくいきます。

char c = 'A';
cout << (int*)&c << '\n';
cout << (void*)&c << '\n';

c08_9002.png

新版明解C++入門編 p.314 演習8-13 のプログラムで、このことを使ってみました。



新版明解C++入門編 p.314 演習8-12
 文字列 s に含まれる最も先頭に位置する文字 c の添字を返す関数 strchr_idx を作成せよ。
    int strchr_idx(const char* s, char c);
 文字列 s が "ABSZXYX" で文字 c が 'X' であれば、返却するのは 4 である。
なお、文字 c が文字列 s に含まれない場合は -1 を返却すること。

// p314_演習8-12
#include <iostream>
using namespace std;

int strchr_idx(const char* s, char c)
{
int n = 0; // n … 文字の添字
int match = 0; // match … 一致する文字があったら 1 にする。
while (*s) {
if (*s == c) {
match = 1;
break;
}
++n; // 添え字を 1 増やす。
++s; // ポインタを 1 増やして、1文字後方を指すようにする。
}
return match ? n : -1;
}

int main(void)
{
char str[128];
cout << "文字列を入力 : "; cin.getline(str, 128);

char c;
cout << "1文字を入力 : "; cin >> c;

cout << "添字 … " << strchr_idx(str, c) << '\n';
}

b08_121.png

b08_122.png




新版明解C++入門編 p.314 演習8-13
 文字列 s に含まれる最も先頭に位置する文字 c へのポインタを返す関数 strchr_ptr を作成せよ。
    const char* strchr_ptr(const char* s, char c);
 文字列 s が "ABSZXYX" で文字 c が 'X' であれば、返却するのは &s[4] である。
なお、文字 c が文字列 s に含まれない場合は NULL を返却すること。

// p314_演習8-13
#include <iostream>
using namespace std;

const char* strchr_ptr(const char* s, char c)
{
int n = 0;
int match = 0;
while (*s) {
if (*s == c) {
match = 1;
break;
}
++n;
++s;
}
return match ? s : NULL;
}

int main(void)
{
char str[128];
cout << "文字列を入力 : "; cin.getline(str, 128);

char c;
cout << "1文字を入力 : "; cin >> c;

const char* p = strchr_ptr(str, c);
cout << '\n';
if (p) {
cout << "返却されたポインターが指す文字 --- " << *p << '\n';
cout << "返却されたポインターの指すアドレス --- " << (void*)p << '\n';
cout << "最も先頭に位置する " << *p << " の添字 --- " << p - str << '\n';
}
else
cout << "NULLが返却されました。" << '\n';

}

b08_131.png

b08_132.png


新版 明解C 入門編 (明解シリーズ)

新品価格
¥2,916から
(2017/8/30 21:02時点)









--
この記事へのコメント
コメントを書く

お名前:

メールアドレス:


ホームページアドレス:

コメント:

※ブログオーナーが承認したコメントのみ表示されます。

この記事へのトラックバックURL
https://fanblogs.jp/tb/6770501
※ブログオーナーが承認したトラックバックのみ表示されます。

この記事へのトラックバック

 たまに、クリック お願いします m(_ _)m

 AA にほんブログ村 IT技術ブログ C/C++へ

こうすけ:メール kousuke_cpp@outlook.jp

【1】★★C++ 記事目次★★ ← 利用可能です。
・新版明解C++入門編 / 新版明解C++中級編
・その他 C++ 関連記事

【2】★★こうすけ@C#★★
・C# の初歩的な記事


検索
<< 2018年08月 >>
      1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31  
プロフィール
こうすけさんの画像
こうすけ

 たまに、クリック お願いします m(_ _)m

 AA にほんブログ村 IT技術ブログ C/C++へ

こうすけ:メール kousuke_cpp@outlook.jp

【1】★★C++ 記事目次★★ ← 利用可能です。
・新版明解C++入門編 / 新版明解C++中級編
・その他 C++ 関連記事

【2】★★こうすけ@C#★★
・C# の初歩的な記事


×

この広告は30日以上新しい記事の更新がないブログに表示されております。