RSS

C言語ではポインターが鬼門である!

20 6月

C言語は、これからプログラミングを始める人には向きませんね。
最大の鬼門が「ポインター」です。
だいたいの人はこれでつまづいてしまいます。
C言語の入門書の最初には”Hello World”というサンプルがありますが、これは文字列を表示させるだけの単純なプログラムで誰でも理解できます。
それじゃ、キーボードから文字列を入力するサンプルはというと、ここでポインタを使うことになります。

文字列を入力するための関数は、scanfですがパラメータはポインタでなければなりません。scanfは下のように定義された関数ですが、…の部分が可変数個のデータが読み込まれる変数です。これはポインタでなければなりません。

int scanf(const char *format, ...)

したがって、次のようなプログラムを書くと正しく動作しません。

 #include <stdio.h>
 int main() {
   int n;
   printf("Enter integer > ");
   scanf("%d", n);
   printf("%d\n", n);
   return 0;
 }

上のプログラムをコンパイルして実行してみるとこんな感じになります。正しく実行されると読み込んだ数がそのまま表示されるはずですが、”Segmentation fault”となってしまいます。

* それ以前にコンパイラの警告が出ています。

user@ubuntu:~/workspace/c/stdio$ vi scanf.c
user@ubuntu:~/workspace/c/stdio$ gcc -o scanf scanf.c
scanf.c: In function ‘main’:
scanf.c:6:2: warning: format ‘%d’ expects argument of type ‘int *’, but argument 2 has type ‘int’ [-Wformat]
user@ubuntu:~/workspace/c/stdio$ scanf
Enter integer > 100
Segmentation fault

user@ubuntu:~/workspace/c/stdio$

それではポインタにするにはどうするかというと、”&”をnの前に付けます。&を付けると「nのポインタ」という意味になります。

#include <stdio.h>
int main() {
  int n;
  printf("Enter integer > ");
  scanf("%d", &n);
  printf("%d\n", n);
  return 0;
}

これだと、ちゃんと入力した数値が表示されます。

user@ubuntu:~/workspace/c/stdio$ gcc -o scanf scanf.c
user@ubuntu:~/workspace/c/stdio$ scanf
Enter integer > 100
100
user@ubuntu:~/workspace/c/stdio$

 
コメントする

投稿者: : 2012/06/20 投稿先 C

 

コメントを残す

以下に詳細を記入するか、アイコンをクリックしてログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト / 変更 )

Twitter 画像

Twitter アカウントを使ってコメントしています。 ログアウト / 変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト / 変更 )

Google+ フォト

Google+ アカウントを使ってコメントしています。 ログアウト / 変更 )

%s と連携中

 
%d人のブロガーが「いいね」をつけました。