質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.46%
参照

参照は、プログラミングにおいて変数や関数といったメモリ空間上での所在を指示するデータのことを指します。その中にはデータ自体は含まれず、他の場所にある情報を間接的に指示するプログラムです。

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

ポインタ

ポインタはアドレスを用いてメモリに格納された値を"参照する"変数です。

Q&A

解決済

1回答

1215閲覧

C#でClass層にある変数へポインタ参照

ParaParaDance

総合スコア56

参照

参照は、プログラミングにおいて変数や関数といったメモリ空間上での所在を指示するデータのことを指します。その中にはデータ自体は含まれず、他の場所にある情報を間接的に指示するプログラムです。

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

ポインタ

ポインタはアドレスを用いてメモリに格納された値を"参照する"変数です。

0グッド

0クリップ

投稿2020/05/15 08:21

編集2020/05/15 08:23

メソッドにポインタ引数を持つ関数があり、メソッド間データを共有したく、以下コードのようにClass層にある変数に引数を宛てるとfixedステートメントの初期化子内のfixedでない式のアドレスのみを取得できますというエラーになります。
何が問題でしょうか。

public class Example { int buff; public void Function() { GETinfo(&buff); //データを受け取る関数 } }

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Zuishin

2020/05/15 08:23

同じ質問を削除して繰り返すのはやめてください。
KOZ6.0

2020/05/15 11:00

「C# fixed」 でググりましょう。
guest

回答1

0

ベストアンサー

ポインタを外部に公開したいということなら、こんな感じですかね。

C#

1using System; 2using System.Runtime.ConstrainedExecution; 3using System.Runtime.InteropServices; 4 5namespace QA261876 6{ 7 class Program 8 { 9 static unsafe void Main(string[] args) 10 { 11 var ex = new Example(); 12 int* ptr = ex.Buffer; 13 *ptr = 1; 14 Console.WriteLine($"Value={ex.Value}"); 15 *ptr = *ptr + 1; 16 Console.WriteLine($"Value={ex.Value}"); 17 } 18 } 19 20 public unsafe class Example : CriticalFinalizerObject 21 { 22 private readonly IntPtr handle; 23 24 public Example() 25 { 26 handle = Marshal.AllocHGlobal(sizeof(int)); 27 } 28 29 ~Example() 30 { 31 Marshal.FreeHGlobal(handle); 32 } 33 34 public int* Buffer { 35 get { 36 return (int*)handle; 37 } 38 } 39 40 public int Value { 41 get { 42 return *Buffer; 43 } 44 } 45 } 46}

#追記

何がなんでも変数のポインタを公開したいということであれば GC の移動対象外にする必要があるので、GCHandle.Alloc でクラスをピン止めしてください。

C#

1 [StructLayout(LayoutKind.Sequential)] 2 public unsafe class Example2 3 { 4 int buff; 5 GCHandle gch; 6 7 public Example2() { 8 gch = GCHandle.Alloc(this, GCHandleType.Pinned); 9 } 10 11 ~Example2() 12 { 13 gch.Free(); 14 } 15 16 public int* Buffer { 17 get { 18 fixed (int* ptr = &buff) { 19 return ptr; 20 } 21 } 22 } 23 24 public int Value { 25 get { 26 return buff; 27 } 28 set { 29 buff = value; 30 } 31 } 32 } 33

投稿2020/05/15 14:44

編集2020/05/16 01:18
KOZ6.0

総合スコア2644

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.46%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問