C言語のポインタとか難しく考えすぎじゃね?

Javaの配列を扱おうとすると、毎回度忘れしてしまっているので、使う度にぐぐっているんだけれど(ぉぃ
何故か・・・HatenaDiaryにあるC/C++の配列とポインタの解決をしているエントリーに行き当たった・・・そこからしてかなり謎w
相当、有名な人の日記なのかね?それか、HatenaDiary自体のSEOが高いとか?
ま、その記事を読んでみたんだけれど・・・
配列とポインタの違いを解説するのに、アセンブリを持ち出していたよ!!
ええええ!!まぢですか!?って、ちょっと思ってしまった・・・
そんな解説の仕方をしていたら、アセンブリ解かる人しか、ポインタ理解できないじゃん。
しかも、内容間違っていたし。
昔、自分がC/C++を始めた時は、まだJavaは全然流行ってなくて、JavaAppletでChatとして使われていたくらいだったかなぁ
そんな時代は、「C言語のポインタを理解できる」と銘打った本が世の中に沢山あった。
自分は一度もそういう本を読んだことがない。
だから、C言語の入門書で解説している概念だけで、ポインタは理解できたし、ポインタを説明するのにも、C言語の概念だけでいいと思う。
それ以上の知識は蛇足だと思う。
もっと、深く知りたい時には必要な知識だとは思うけれど、C言語のポインタを理解するのにアセンブリはいつ必要なんだ?ずっと知らなくても別に理解できるだろ?って思う。
さて、C言語のポインタって、ぶっちゃけただのアドレス値じゃない?
それ以上に何かあるとしたら、ポインタと配列は同じ様に扱う事が出来る。という事だろう。
前に、同じ年の人が一時的に今の職場に来て、C言語できる。というから、ポインタと配列の違いが解かります?って聞いたら
「え?ポインタも配列も同じじゃないっすか。」
と言われた。
そうだよね。理解してる人に取っては、特に何でもないものなんだと思う。
char szMsg1[];
char *szMsg2;
という宣言があったら、
C言語のポインタを理解している人に取ってはszMsg1 とszMsg2 は同じ物じゃないだろうか?
=== 追記 ===
勘違いしてるやつが書いた、勘違いを促す文章だったので
同じ様にメモリ演算してくれる物。って意味に、訂正で・・・
トラックバックで指摘されているので、そちらなどを参考にどうぞ。
===
C言語で構造体を扱うと一発で解かると思う。
C言語使いの人達は当たり前にこういう使い方をするからねぇ・・・
なんだろう。動的に、プログラマーがメモリを確保する言語だから、そういう概念があるんだよね。
だから、他の言語をやってる人からは余り理解できない部分かもしれない。
DirectXで、WindowsApplicationを創っていたはずなんだけれど・・・何故か、Linux上でC言語のサンプルコード書いてしまった!!w
昔に書いた、構造体の穴と言われる、alignmentに関しても一緒に見ておくといいかも。
自分で、メモリを16進数で計算しようとしても、処理系によってはこうやって、アクセスを早くしようとalignmentを揃える時があるというのを覚えておくべきだね。
C言語の場合、きちんとコンパイラが[]演算子でサイズを計算して、ポインタ値をずらしてくれているから、構造体の穴にはまることはないかな。アセンブリ書く人は、気をつけないといけないかも(・・?
ちなみに、PS3のCellのサブチップなんかは、Alignmentを揃えない変数は使うことすら難しいです。ってか、SIMDにかけられないから、使えないです。
structure.c
alignment.c
ちなみに、自分がみた記事だと、どうにも、ポインタへの const と勘違いしていたようだ。
C言語では、const に関しても色々なテクニックがあるっていうか、常識なんだけれど
ポインタ値に対しての const なのか、ポインタ値が指している先の値に対しての const なのかによってかなり違う。
C++の参照なんかは、前者だね。一度設定した、ポインタ変数のアドレス値は変えられません。
他にも、標準関数なんかで自分は最初に見たけれど、引数指定がに const char * になってるやつなんかは頭良いよね。
こいつを受け取っても、値を変化させたりして返しませんよ。という意志表示なんだよね。
あー ついでに、const の話をしちゃったから、const の例も書いてみた。
const.c
gccだとちゃんとチェックしてくれるからいいけれど、コンパイラによってはチェックしないのもあるかも?
自分は、gccでコンパイル通すためにコメントアウトしたけれど、コメント外して make 実行すると、コンパイル通らないのが解かります。
const.c:15: error: assignment of read-only variable str2
と出るはず。
これは、str1が、文字列に対しての const なのに対して(最近のC言語の解釈では、”"で挟まれる文字列リテラルは元々constだった気がする)
str2は、文字列を指すポインタ値がconstなのですよ。なので、ポインタ値の変更は許されません。
ま、C言語使っている人にとってはこの辺りは当たり前だよねぇ
これを理解していないと、プログラムなんて全然組めない気がする。
最後になったけれど、自分がJavaの配列で調べたかったのは・・・
public String[] names;
という書き方できるよね?
っていう事でした。
Javaの配列はちょっとおかしくて
public String names[];
というC言語スタイルの書き方も出来るんだよね~
でも、職場のJava使い曰く、前者を書く人はJavaの配列を理解している!!って言っていた。
確かに、自分もそう思う。
だって、Javaの場合
「String型の配列のインスタンス」
と考えた場合、前者の方がすっきりこない?変数型の部分だけに意味を持たせているよね。
C言語と違ってポインタがないから、これで良いと思う。

Leave a comment

2 Comments.

  1. [c/c++]やはりCのポインタは難しいものだ……

    ポインタと配列は一緒のもの? 違うよ、全然違うよ。 前に、同じ年の人が一時的に今の職場に来て、C言語できる。というから、ポインタと配列の違いが解かります…

  2. ポインタネタ

    仕事中にボケっと見てたもの。C言語のポインタとか難しく考えすぎじゃね? – So…

Leave a Reply


[ Ctrl + Enter ]

Spam Protection by WP-SpamFree