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

C#でポインターをメソッドのパラメーターとして渡す方法を解説

C#でポインターをメソッドのパラメーターとして渡す方法

C#では、unsafeキーワードを使用することで、ポインターをメソッドのパラメーターとして渡すことができます。本記事では、2つの変数の値を入れ替えるswap関数を例に、具体的な実装手順を解説します。

手順1:unsafe修飾子を付けたswap関数を作成する

まず、unsafe修飾子を付けたswap関数を作成します。この関数は2つのint型ポインターを受け取り、ポインターが指し示す先の値を入れ替えます。

public unsafe void swap(int* p, int *q) {
    int temp = *p;
    *p = *q;
    *q = temp;
}

ポインターの参照先にアクセスするために、間接演算子(*)を使って値を読み書きしている点に注目してください。

手順2:Mainメソッドで変数とポインターを設定する

次に、static void Main内で、1つ目と2つ目の変数にそれぞれ値を設定し、各変数のアドレスを格納するポインターを作成します。

手順3:値を表示してswap()メソッドを呼び出す

変数の値をコンソールに表示した後、上記で作成したswap()メソッドを呼び出します。メソッド内で値が入れ替わり、その結果が表示されます。

public unsafe static void Main() {
    Program p = new Program();
    int var1 = 10;
    int var2 = 20;
    int* x = &var1;
    int* y = &var2;

    Console.WriteLine("Before Swap: var1:{0}, var2: {1}", var1, var2);
    p.swap(x, y);

    Console.WriteLine("After Swap: var1:{0}, var2: {1}", var1, var2);
    Console.ReadKey();
}

実行結果

Before Swap: var1:10, var2: 20
After Swap: var1:20, var2: 10

swap()メソッドを呼び出した後も、元の変数var1とvar2の値が直接入れ替わっていることが確認できます。これは、ポインター経由で変数のメモリ上のアドレスに直接アクセスしているためです。

補足:unsafeコードのコンパイルについて

ポインターを使用するコードは「アンセーフコード」と呼ばれ、既定ではコンパイルできません。コンパイル時に/unsafeオプションを指定する必要があります。Visual Studioを使用している場合は、プロジェクトのプロパティ→「ビルド」タブから「アンセーフ コードの許可」にチェックを入れてください。

  1. Photoshopでフェイススワップする方法|マスクとオブジェクト選択で自然に顔を入れ替える

    一見ふざけた遊びに見える「フェイススワップ(顔の入れ替え)」ですが、実は写真家にとってとても役立つ編集テクニックです。たとえば、撮影したすべての写真で被写体の人が目をつぶってしまっていた場合でも、別の成功ショットから同じ人の顔を移植すれば、失敗写真を見違えるほど美しく修正できます。 もちろん、友達を驚かせるための面白い合成画像づくりにもよく使われる技法です。Photoshopなら初心者でも比較的簡単に作業でき、仕上がり次第では本物と見分けがつかないほどリアルになります。ここでは、その具体的な手順を詳しく解説します。 レイヤーマスクを使ったフェイススワップのやり方 フェイススワップには

  2. JavaScriptでメソッドを借りる方法とは?call()・apply()・bind()の使い方を解説

    JavaScriptでは、call()、apply()、bind() の3つのメソッドを使うことで、他のオブジェクトが持つメソッドを「借りて」実行することができます。このテクニックは「メソッドの借用(Method Borrowing)」と呼ばれ、コードの再利用性を高めるために広く活用されています。call()・apply()・bind() の違いcall():第1引数に this として渡したいオブジェクトを指定し、残りの引数はカンマ区切りで個別に渡します。呼び出し時に即座に実行されます。apply():call() とほぼ同じですが、引数を配列(または配列風オブジェクト)としてまとめて渡す点