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

C/C++で大きい方の値のアドレスを返す関数ポインタの宣言方法を解説

この記事では、2つの整数値を比較し、大きい方の値が格納されているメモリアドレスをポインタで返すC/C++関数の作成方法を解説します。

関数ポインタを利用すると、実行時に異なる関数のアドレスを渡すことができ、プログラムの柔軟性と抽象性が大きく向上します。実行時の値に基づいて実行する関数を動的に選択できるため、コードをシンプルで保守しやすいものにすることも可能です。

big()関数の仕組み

このプログラムでは、2つの整数を参照渡しでbig()関数に渡します。big()関数は受け取った2つの整数値を比較し、大きい方の値のメモリアドレスを返します。戻り値は整数型のポインタであり、その値はゼロまたは非ゼロのいずれにもなり得ます。

実行例

入力 − 7 13

出力 − 大きい値は13です

入力 − 8 6

出力 − 大きい値は8です

解説 − 2つの整数値を比較した後、ポインタは大きい方の値のメモリアドレスを返します。

実装のアプローチ

  • 整数ポインタを用意します(例:int *c)。
  • 2つの整数変数を初期化します。
  • 2つの値を入力します。
  • 与えられた2つの値を比較します。
  • 最後に、ポインタ*cが大きい方の値のアドレスを返します。

アルゴリズム

開始
ステップ1: 関数を作成し、引数を渡す
    int *big(int &, int &)
終了
ステップ2: main()関数で2つの値を入力・出力し、ポインタ*cを初期化する
    int a, b, *c
    c = big(a, b) を呼び出す
    c の内容を出力する
終了
ステップ3: 渡された2つの整数値を比較し、大きい方の値のメモリアドレスをポインタc経由で返す
    比較処理
    if(x > y)
        return(&x)
    else
        return(&y)
    終了
停止

サンプルコード

#include<iostream.h>
int *big(int&, int&);
int main( ){
    int a, b, *c;
    c = big(4, 7);
    cout<<"大きい値は"<<*c<<"
";
    return 0;
}
int *big(int&x, int&y){
    if(x>y)
        return(&x);
    else
        return(&y);
}

出力結果

上記のプログラムを実行すると、以下のような出力が得られます。

大きい値は7
大きい値は5

このように、関数ポインタと参照渡しを組み合わせることで、値そのものではなくアドレスを返す柔軟な関数設計が実現できます。メモリ効率を意識したC/C++プログラミングにおいて、非常に有用なテクニックです。

  1. C++のnew演算子を使って2次元配列を動的に宣言・生成する方法

    動的な2次元配列とは、基本的に「配列へのポインタ」を要素とする配列(ポインタの配列)のことです。つまり、各行が独立した1次元配列としてヒープ上に確保され、それらの先頭アドレスを格納するポインタ配列によって全体が管理されます。下図は、3×4の2次元配列のイメージです。アルゴリズムC++のnew演算子で2次元配列を動的に確保する手順は以下の通りです。Begin 配列の寸法(行数・列数)を宣言する。 new を使って 2次元配列 a[][] を動的に確保する。 配列に要素を代入する。 配列の内容を出力する。 delete でメモリを解放する。 Endサンプルコ

  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