Cプログラミング
 Computer >> コンピューター >  >> プログラミング >> Cプログラミング

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をポインタに適用すると、指し示す先のオブジェクトのサイズではなく、ポインタ変数自身のサイズが返されることを覚えておきましょう。

  1. C/C++のポインタとJavaの参照(リファレンス)の違いを徹底解説

    C/C++とJavaはどちらも広く使われるプログラミング言語ですが、メモリ上のオブジェクトを扱う仕組みが大きく異なります。C/C++では「ポインタ」、Javaでは「参照(リファレンス)」と呼ばれる概念がそれに該当します。本記事では、それぞれの基本的な使い方をコード例とともに確認した上で、両者の主な違いをわかりやすく解説します。 ポインタとは C言語およびC++において、ポインタとは他の変数のアドレス(メモリ上の場所)を格納するための変数です。ポインタを通じて、元の変数の値を間接的に読み書きすることができます。 サンプルコード #include <iostream> using na

  2. 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