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';
別の適当な型、例えば int*型 や void*型にキャストするとうまくいきます。
char c = 'A';
cout << (int*)&c << '\n';
cout << (void*)&c << '\n';
新版明解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';
}
新版明解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';
}
--
この記事へのコメント
コメントを書く
この記事へのトラックバックURL
https://fanblogs.jp/tb/6770501
※ブログオーナーが承認したトラックバックのみ表示されます。
この記事へのトラックバック