ブログ「サイバー少年」

ブログ「サイバー少年」へようこそ!
小学六年生ごろからプログラミングを趣味にしている高校生のブログです。
勉強したことについての記事などを書いています。フリーソフトも制作、公開しています。
(当ブログについて詳しくは「ブログ概要紹介」を参照)

サイバー少年が作ったフリーソフトは「サイバー少年の作品展示場」へ

C#でunsafeポインタ

あまり使いませんが、C#でも実はポインタが使えちゃいます。

C言語との相互運用が主な目的なようで、推奨はされていません。

まずプロジェクト設定でアンセーフコードを許可するにチェックします。

さらに、ポインタを使いたい部分でunsafeキーワードを付けないといけません。

手っ取り早いのはunsafeブロックですね。

unsafe
{
//.......
}


unsafe内では、C言語にあるような、普通C#では出来ないコードを書くことが可能です。

その一つがポインタ。

*や&など、使い方はC言語と同じです。




unsafe
{
 int x = 10;
 int* p = &x;
 Console.WriteLine(*p);
 // "10"と出力される。
}

例えばこのコードでのポインタはC言語と同じく、
int*型となっていて、int型と相互変換可能です。

int型はSystem.Int32の別名なので.NET的に成り立っていますが、
int*型ってなんやねん!と言いたくなります。

実際、int*型をSystem.Object型にキャストすることはできませんでした。

C#のポインタは、普通の型と同じようには説明のつかない特殊な型なんですよね。
C言語なら説明つきますが…。


ちなみに

unsafe
{
 int* p = (int*)2545432; // テキトーなアドレス
 Console.WriteLine(*p);
}

みたいに、メチャクチャなところにアクセスしようとしたら、
保護されているメモリにアクセスがなんたらとAccessViolationExceptionが発生します。

しかし、テキトーなアドレスに、0はもちろんのこと、1とか10とか指定した場合は、
なんと、NullReferenceExceptionが発生します。

“あるなんらかの数”以下のアドレスはnullになるんでしょうかね…。


C#でもポインタが使えて、なかなか新鮮な気分です。
ただ、やはりそこはC#ですから、制約は多いみたいです。

本当にポインタのプログラムをしたいならC言語のほうがいいと思いますね。




ところで、何で私はポインタを使えているのか…?

私はポインタの勉強をしたことがありません。
なぜ使えているのか自分でも不思議です。

まぁ、私もちゃんと理解しているわけではなく、「なんとなくこうなるかなぁ」という感じなのですが、
一応、ちゃんとポインタのプログラムを書けています。

よく、C言語のポインタが難しくて挫折する人がいるようですが、
あれは、そもそもプログラミングをC言語から始めたから難しいんだと思います。

プログラミングについてよく知らないのに、いきなりポインタなわけです。

初心者の方はメモリをイメージすることが難しいでしょう。


その点、私はポインタの無いVB.NET、C#ですが、
プログラミングというものを、それなりに経験しています。

やっぱり、それでC#なんかを勉強している際に
メモリの仕組み等も、同時に知識として入ってきますから、

ポインタの概念も抵抗なく理解できて、使えているんじゃないかと思います。


C言語から始めるのは結構、ハードですね。

tag:

コメント

コメントの投稿

トラックバック

トラックバック URL
http://cyberboy6.blog.fc2.com/tb.php/253-e6797887
この記事にトラックバックする(FC2ブログユーザー)

当ブログをご利用(閲覧等)になる場合は必ず「当ブログの利用規定」をお守りください。