C 言語で何か作れる人にはどうでもいい話。
今となっては C/C++, C#, Python, PHP をゴチャマゼで利用している私ですが…
十年前は C 言語を勉強していて見事ポインタで挫折した人である。
ポインタは実態へのアドレス(以下略
って、そんなのは解っているよ!だからポインタをどう使えばソフトウエアが作れるんジャ!
という理由である、勝手な思い込みだけど似たような人は多いと思う。
こんな状態である人に解りやすく説明してくれている本やサイトは存在しない。
実はたった一つのことだけを気がつけばいいだけ。
以下のコードについて細かい説明は一切しない、初心者本を読んでくれ。
#include <stdio.h> void plusfunc(int num1, int num2, int nResult) { nResult = num1 + num2; } int main(int argc, char *argv[]) { int n1, n2, n3; n1 = 2; n2 = 3; n3 = 0; plusfunc(n1, n2, n3); printf("%d+%d=%d\n", n1, n2, n3); return 0; }
コレを実行すると
2+3=0
と出力される、つまりコレじゃ関数で値を変更できないんだよ!
理由が解らない人は本で調べよう、だからポインタを使う。
#include <stdio.h> void plusfunc(int num1, int num2, int* nResult) { *nResult = num1 + num2; } int main(int argc, char *argv[]) { int n1, n2, n3; n1 = 2; n2 = 3; n3 = 0; plusfunc(n1, n2, &n3); printf("%d+%d=%d\n", n1, n2, n3); return 0; }
これで 2+3=5 と正常な出力になる、と初心者本はこんな感じの説明をしていたと思う。
いや、このコードって何かおかしいだろ?余程のバカでなければこう書くはずだ。
#include <stdio.h> int plusfunc(int num1, int num2) { return num1 + num2; } int main(int argc, char *argv[]) { int n1, n2, n3; n1 = 2; n2 = 3; n3 = plusfunc(n1, n2); printf("%d+%d=%d\n", n1, n2, n3); return 0; }
えっと、つまりポインタってどういう時に使えば使いこなせるの?
となってしまった、だから私はポインタが無い Delphi に一度逃げた…
という昔話はどうでもよくて。
int で説明するから理解できない、文字列で説明すればアッサリ理解できる。
#include <stdio.h> #include <string.h> void plusfunc(int num1, int num2, char* szResult) { sprintf(szResult, "%d だよ!", (num1 + num2)); } int main(int argc, char *argv[]) { int n1, n2; char szRes[16]; n1 = 2; n2 = 3; strcpy(szRes, "0 かな?"); plusfunc(n1, n2, szRes); printf("%d+%d=%s\n", n1, n2, szRes); return 0; }
C 言語の文字列は = で代入できないので関数を使うしかない。
つまり = では値を変更できないものを変更する関数を作る時にポインタを使う。
それだけ、strcpy 等の標準関数だってやはりポインタを使っているわけです。
それに気がついただけでいつのまにか C 言語は書けるようになった。
もっと細かいことについては何か作っていれば自然と理解できているはず。
手持ちの本で int で説明されている部分を文字列に置き換えて読めば結構理解が早い。
どうしてプログラミング本って全部 int なんでしょう?int だから解らないのに。
一つの関数が int の値を二つ返したいとき
(日付を渡して、最高温度と最低温度を取得したいときとか)
どうしますか?
そういう場合であれば尚更だけど構造体にしてポインタを渡そうと思いません?
私なら Windows の POINT 構造体みたいなのを作ろうと考えますけど。
ま、人によるかもね。