• 締切済み

C#でポインタを利用したい

C# 2010 version 4.0を使用しています。 下のコードでは、 class1のメンバ変数のkのアドレスを取得してポインタ変数aに参照させたいと思っているのですが、 「fixed ステートメントの初期化子内の fixed でない式のアドレスのみを取得できます。」 というようなエラーがでてしまいます・・・ これはどのように記述したら解決できるのでしょうか? class class1 { private int k = 1; unsafe public void Bind(int* i) { i = &(this.k);//この部分がエラー } } class Program { unsafe static void Main(string[] args) { class1 c = new class1(); int* a = null; c.Bind(a); Console.WriteLine(*a); // 1が表示されたい Console.ReadLine(); } }

みんなの回答

回答No.4

> たしかにこれだとできるのですが、 > クラスのメンバ変数を使うと先ほどのようなエラーがでてまいます・・・ アドレスを解決できないですからね。 …だけで終わったらどうします?また聞くんですか? しかも「でてまいます」って誤字だし。 聞きたいのであれば、ちゃんと聞きましょう。 確かに「聞きたいであろう」ということは分かりますが、 もう少し丁寧に「聞く」ことを心がけましょう! (少し不快に感じたのであえて言っています。) 取り敢えずこんな感じなら簡単ですがやりたいことが実現できてますか? コンパイルだけなら通るハズです。 (というかNo.3の内容をよく考えれば分かりそうですが…) class class1 { private int k = 1; unsafe public void Bind(int* i) { int localK = k; i = &localK; } } class Program { unsafe static void Main(string[] args) { class1 c = new class1(); int* a = null; c.Bind(a); Console.WriteLine(*a); Console.ReadLine(); } } (せっかくポインタの概念を外したC#で)何を実現されたいのか分かりませんが、 通常のC#と違いポインタを使用する場合はアドレスの概念が発生します。 それを念頭に置かないと、同様の理由によるエラーが発生します。 それと、この感じだとNullReferenceExceptionについても聞かれそうなので 先に回答しておきます。(上記コードを実行すると発生します) 理由は参照渡しではなく値渡しになっているからです。 (なぜ値渡しか…等はアドレスの概念と合わせて勉強して下さい) なので、実際に期待されるコードにするのであれば 以下のようなコードでないといけません。 class class1 { private int k = 1; unsafe public int* Bind() { int localK = k; return &localK; } } class Program { unsafe static void Main(string[] args) { class1 c = new class1(); int* a = null; a = c.Bind(); Console.WriteLine(*a); Console.ReadLine(); } } このコードであれば、取り敢えず「1」と表示されます。 取り敢えずこのサイト辺りから初めて http://ufcpp.net/study/csharp/sp_unsafe.html よく分からないのであれば書籍の購入も検討しましょう。

takagoo100
質問者

お礼

ご回答ありがとうございます。 気分を害されたのなら、申し訳ございません。 自分の求めてる結果と違うようなので、もう少し質問させて頂きたいのですが、 今の自分のレベルではポインタについてしっかり理解するまで時間がかかりそうですので、 とりあえずこれで質問を締め切りたいと思います。

回答No.3

すいません、最初のは忘れて下さい。 こうです。 class class1 { unsafe public void Bind(int* i) { int k = 1; i = &k; } } class Program { unsafe static void Main(string[] args) { class1 c = new class1(); int* a = null; c.Bind(a); Console.WriteLine(*a); Console.ReadLine(); } } これで取り敢えず実行はできるハズです。 結果は…

takagoo100
質問者

お礼

ご回答ありがとうございます。 たしかにこれだとできるのですが、 クラスのメンバ変数を使うと先ほどのようなエラーがでてまいます・・・

回答No.2

はわゎ… 「fixed ステートメントの初期化子内の fixed でない式のアドレスのみを取得できます。」 だけ読んで回答しちゃいました。 大変申し訳ありません。 > i = &(this.k);//この部分がエラー kがフィールド変数(メンバ変数?)だからですね。 unsafe public void Bind(int* i)内に int k = 1; と書いてあげればOKなハズです。 フィールド変数(メンバ変数?)だと「いや、ドコだし」って怒ってるワケです。

takagoo100
質問者

お礼

ご回答ありがとうございます。 こうですか? int k = 1; fixed (i = &k) { } これでも「IDがありません」というエラーです・・・ =のところにエラーが出てるようなのですが

回答No.1

こんばんわ! i = &(this.k);//この部分がエラー ↓↓↓↓↓↓↓ fixed (i = &this.k) { } こうでなかったでしたっけ??

takagoo100
質問者

お礼

ご回答ありがとうございます。 fixed (i = &this.k) { } だと 「ID がありません。」 というエラーになってしまいます・・・ =のとこでエラーが出てます。 そもそもこの{ }の中でなにをすれば良いのでしょうか?

関連するQ&A