ポインタについて理解を深めるために演習問題をやるよ
演習1
変数のアドレスを表示して確認するやつ
前回、変数のアドレスを表示して、変数のアドレス、および、配列のアドレスの変化と型の関係を確認するプログラムを作ってみた。
このプログラムの配列の型を、
- short
- float
- double
- (char)は変換して表示すればいいけど、ちょっとめんどくさいからやめておこう。。。割と大事なんだけどね。。。
に変更して、アドレスの変化がどうなるか確認しなさい。
演習1の解説というか答えというか
coutで普通にchar型のアドレスを表示するとchar *型とみなされる。
これはどういう意味かなと考えてみると、ちょっと面白い。
#include <iostream> using namespace std; int main() { int a[5] = { 1, 3, 5, 7, 9}; int *p = nullptr; p=a; cout << a+0 << endl; cout << a+1 << endl; cout << a+2 << endl; cout << a+3 << endl; cout << a+4 << endl; }
これを実行すると
0x7ffca6c440c0
0x7ffca6c440c4
0x7ffca6c440c8
0x7ffca6c440cc
0x7ffca6c440d0
0x7ffca6c440c4
0x7ffca6c440c8
0x7ffca6c440cc
0x7ffca6c440d0
当然アドレスが表示されます。
#include <iostream> using namespace std; int main() { char a[5] = {'a','b','c','d','\0'}; char *p = nullptr; p = a; cout << a+0 << endl; cout << a+1 << endl; cout << a+2 << endl; cout << a+3 << endl; cout << a+4 << endl; }
じゃぁ、っていうので、これを実行して結果を表示してみます。
abcd
bcd
cd
d
これはどういうことか考えてみよう!
んで、元に戻って、練習問題の解説します。
- char型(8bit整数)をcoutにそのままぶっこむと対応するASCIIコードの文字を表示しちゃう
- char型の配列+'\0'=文字配列(C++の文字列表現)のアドレスをcoutにぶっこむと文字列だと思われて文字の列を表示しちゃう(しかも'0'なくても…)
なので、char型の変数のアドレスをcoutで表示しようとすると、いろいろしんどい。。。
なので、(C++の太古の祖先である)C言語の(とてもありがたい)表示関数を呼び出す。
これはレジェンドクラスの召喚魔法であるため、使用にはかなりの知識と熟練を要する。
リンク:printfの解説ページ、一生懸命作ったから見てネ
#include <iostream> int main() { //アドレスは変数が格納されているメモリの住所 //通常の変数は、宣言した瞬間にメモリ領域が確保される //=アドレスが確定する int vInt = 1; short vShort = 2; float vFloat = 3.14; double vDouble = 2.15; char vChar = 'a'; printf("vInt 値:%4d| addr:%p\n", vInt, &vInt); printf("vShort 値:%4d| addr:%p\n", vShort, &vShort); printf("vFloat 値:%4.2f| addr:%p\n", vFloat, &vFloat); printf("vDouble 値:%4.2f| addr:%p\n", vDouble, &vDouble); printf("vChar 値:%4d| addr:%p\n", vChar, &vChar); }