#07:ポインタの間違えやすいところ
ポインタを使う上で間違えやすいところを取り上げます。
ポインタ型の p 変数を宣言して代入するには、次のように記述します。int *p = &x;
これは、以下のように書いたのと同じ動作になります。int *p;
p = &x;
※上の宣言と代入を 1 行で書く方法は、*p = &x;
となっているように誤解してしまいやすいので注意してください。
x 変数のアドレスは &x とすれば取得することができます。
しかし、&x を左辺にしてアドレスとして代入することはできません。
次のようなプログラムはエラーになります。#include <stdio.h>
int main(void)
{
int x;
int y = 20;
&x = &y; // &x を左辺にして代入できない
printf("%d\n", x);
}
ポインタを扱う処理を記述したいときには、ポインタ型の変数を使うようにしましょう。
ポインタの型は、アドレスを代入する変数の型に合わせて適切に選ぶ必要があります。
※paiza.IO の環境ではポインタの型が異なっていてもプログラムを実行することができますが、
型の違いにより warning が出ます。#include <stdio.h>
int main(void)
{
int x = 10;
char *p;
// char* 型の変数に int* 型の値を代入しているため、warning が出る
p = &x;
printf("p : %p\n", p);
printf("*p : %d\n", *p);
}
・エラー出力のメッセージMain.c:10:7: warning: incompatible pointer types assigning to 'char *' from 'int *' [-Wincompatible-pointer-types]
p = &x;
^ ~~
1 warning generated.
ヌル文字とヌルポインタは違うものです。
・ヌル文字 ('\0') : 文字列の最後に使われる char 型の文字
・ヌルポインタ (NULL) : 何も指し示さないことを表す特別なポインタ
文字列で、ヌル文字の代わりにヌルポインタを使ってしまう間違いがよくあるので、注意するようにしてください。
- IT専科 - C言語入門 ポインタ
http://www.itsenka.com/contents/development/c/pointer.html
- ものづくりC言語塾 - C言語 NULLポインタ
https://monozukuri-c.com/langc-nullpointer/