C/C++ポインタパズル:ポインタのサイズはいくつ?
ポインタとは?
ポインタとは、別の変数のアドレス(メモリ上の場所)を格納するための変数です。ポインタのデータ型は、指し示す対象となる変数のデータ型と一致させる必要があります。
このパズルでは、「使用しているポインタそのもののサイズ」について理解しているかが問われます。変数のサイズを予想することで、ポインタに対する理解度をチェックする仕組みになっています。
ここでの重要なポイントは、int型のサイズは4バイトである一方、int型へのポインタのサイズは8バイト(64ビット環境の場合)という点です。それでは、以下のC++プログラムであなたのスキルを試してみましょう。
サンプルコード
#include <iostream>
using namespace std;
int main() {
int a = 6 ;
int *p = &a;
int arr[5][8][3];
int *q = &arr[0][0][0];
int ans;
cout<<"the value of a is "<<a<<endl;
cout<<"predict the size of a ";
cin>> ans;
if(ans == sizeof(p)) {
cout<<"Hurry! your prediction is right";
} else {
cout<<"Your Guess is wrong ";
}
cout<<"Now try this "<<endl;
cout<<"arr is a 3D array"<<endl;
cout<<"predict the size of arr ";
cin>> ans;
if(ans == sizeof(q)) {
cout<<"Hurry! your prediction is right";
} else {
cout<<"Your Guess is wrong ";
}
return 0;
}実行結果
the value of a is 6 predict the size of a 8 Hurry! your prediction is right Now try this arr is a 3D array predict the size of arr 4 Your guess is wrong
解説:なぜこうなるのか?
最初の質問では、変数aのサイズではなくポインタpのサイズがsizeof(p)で計算されています。64ビット環境ではポインタは一律8バイトのため、答えは「8」となり正解となります。
2つ目の質問が落とし穴です。arrは5×8×3の要素を持つ3次元配列ですが、qはあくまでarr[0][0][0]のアドレスを格納する単なるポインタにすぎません。したがって、配列全体の大きさ(5×8×3×4=480バイト)とは無関係に、ポインタq自体のサイズはやはり8バイトです。「4」と答えると不正解となってしまうのです。
このように、sizeofをポインタに適用すると、指し示す先のオブジェクトのサイズではなく、ポインタ変数自身のサイズが返されることを覚えておきましょう。
-
C/C++のポインタとJavaの参照(リファレンス)の違いを徹底解説
C/C++とJavaはどちらも広く使われるプログラミング言語ですが、メモリ上のオブジェクトを扱う仕組みが大きく異なります。C/C++では「ポインタ」、Javaでは「参照(リファレンス)」と呼ばれる概念がそれに該当します。本記事では、それぞれの基本的な使い方をコード例とともに確認した上で、両者の主な違いをわかりやすく解説します。 ポインタとは C言語およびC++において、ポインタとは他の変数のアドレス(メモリ上の場所)を格納するための変数です。ポインタを通じて、元の変数の値を間接的に読み書きすることができます。 サンプルコード #include <iostream> using na
-
C/C++における配列の減衰(Array Decay)とは?仕組みと注意点を解説
C/C++では、配列とポインタは非常によく似た挙動を示します。しかし、両者にはいくつかの微妙な違いが存在します。その代表例が、sizeof 演算子の挙動です。配列をポインタに変換すると、元の配列が持っていた情報の一部が失われます。これを「減衰(decay)」と呼びます。サンプルコード#include<iostream> int main() { const int a[] = { 2, 3, 5, 7, 11 }; const int* p = a; std::cout << ( sizeof(p) != sizeof(a) ); }実行結果1