2008/04/04

Recent entries from same category

  1. Windowsで動くMemcached::libmemcachedの作り方 Hatena
  2. libmemcached for win32出来た Hatena
  3. あぶないコード Hatena
  4. 知らない事あるなぁ...C言語 Hatena
  5. 自作のWindowsアプリケーションにJavaScriptで動作するプラグイン機能を実装する方法 Hatena

はてな
たぶん「ポインタ変数はポインタ型」で「配列変数は配列型」というイメージが持てないから。
C/C++のポインタの機能--変数の場所(アドレス) - builder by ZDNet Japan
int *n;
*n = 5; /* ポインタ変数nに値5を代入 */ 
現在は本文が修正されています。

C/C++のポインタの機能--配列との関係 - builder by ZDNet Japan

ポインタ変数と配列との深い関係を表す例を示そう。それは、配列の変数名をそのままポインタ変数名として扱えるということだ。


たぶん
int *n;
こう宣言するから
*n = 5;
こうしたくなる訳で
int* n;
こう宣言すれば、もしくは
typedef int * int_ptr
こうしておいて
int_ptr n;
こう宣言すれば
*n = 5;
こんな事が間違ってる事に気付くかな?
int m[] = {1,2,3,4};
int *n;
n = m;
ここでいうnへのmの代入は、mの先頭アドレスをnが指しているだけなのです。ポインタは「指し棒」!配列はメモリのかたまり!
※最近のC言語の本って「先頭アドレス」って表現あまり見ない気がする。

ちなみに、間違っても
char* n, m;
m = "Hello, World";
とか
#define char_ptr char *
...
char_ptr n, m;
m = "Hello, World";
しちゃ駄目(typedef使ってね)。

ちなみに...
char *s = "abc";
char s[] = "abc";
の話も前者が「ポインタ型」、後者が「配列型」と考えればいい。
つまり
typedef char char4[4];
char4 n = "abcef"; // char[4]型変数をchar[6]で初期化
こうすると、コンパイラによっては警告出力してくれる訳です。

WriteBacks

TrackBack ping me at
Post a comment

writeback message: Ready to post a comment.