C言語でポインタ変数
auです。
前回はアドレスについて勉強しました。
program-shoshinsya.hatenablog.com
今回は、それを使ってプログラムするポインタ変数について書きたいと思います。
ポインタ変数とは
ポインタ変数とは、アドレスを代入する変数のことです。
ポインタ変数の宣言の仕方は、変数の前に「*」を付けることです。
int *p;
これで変数名pであるポインタ変数の宣言ができました。
このポインタ変数にアドレスaを代入します。
int a; int *p; p = &a;
これでアドレスをポインタ変数に代入ができます。代入するときには、"*p"ではなく"p"に代入します。
"char型"を"int型のポインタ変数"に代入できないようになっているので代入する型は合わせましょう。
実際にプログラミングしてみます。
#include<stdio.h> int main(void) { int a; // int型変数a int *p; // ポインタ変数p a = 1; printf("aのアドレス: %p\n", &a); p = &a; //aのアドレスをpに代入 printf("ポインタ変数pのアドレス: %p\n", p); printf("ポインタ変数pの値: %d\n", *p); return 0; } // 実行結果 aのアドレス: 0x7fffbfc9217cポインタ変数pのアドレス: 0x7fffbfc9217c ポインタ変数pの値: 1
変数aも変数pも、intで宣言したのにも関わらず同じアドレスになりました。
次にint型の変数iを宣言してみました。
#include<stdio.h> int main(void) { int a; // int型変数a int *p; // ポインタ変数p int i; a = 1; printf("aのアドレス: %p\n", &a); p = &a; //aのアドレスをpに代入 printf("ポインタ変数pのアドレス: %p\n", p); printf("ポインタ変数pの値: %d\n", *p); i = 2; printf("iのアドレス: %p\n", &i); p = i; printf("ポインタ変数pのアドレス(i): %p\n", p); printf("ポインタ変数pの値(i): %d\n", *p); return 0; } // 実行結果 // gcc(コンパイル)したとき pointa.c: In function ‘main’: pointa.c:13:7: warning: assignment makes pointer from integer without a cast [-Wint-conversion] p = i; ^ // ./a.outしたとき aのアドレス: 0x7ffff5c9ef58 ポインタ変数pのアドレス: 0x7ffff5c9ef58 ポインタ変数pの値: 1 iのアドレス: 0x7ffff5c9ef5c ポインタ変数pのアドレス(i): 0x2 Segmentation fault (core dumped)
"&i"ではなく"i"を代入しましたが"warning"となってしまいました。
最後のprintがちゃんと行われておらず、faultと言われているのでできないみたいです。
次はちゃんと"&i"で代入してみます。
#include<stdio.h> int main(void) { int a; // int型変数a int *p; // ポインタ変数p int i; a = 1; printf("aのアドレス: %p\n", &a); p = &a; //aのアドレスをpに代入 printf("ポインタ変数pのアドレス: %p\n", p); printf("ポインタ変数pの値: %d\n", *p); i = 2; printf("iのアドレス: %p\n", &i); p = &i; printf("ポインタ変数pのアドレス(i): %p\n", p); printf("ポインタ変数pの値(i): %d\n", *p); return 0; } // 実行結果 aのアドレス: 0x7fffc9667478 ポインタ変数pのアドレス: 0x7fffc9667478 ポインタ変数pの値: 1 iのアドレス: 0x7fffeec19f5c ポインタ変数pのアドレス(i): 0x7fffc966747c ポインタ変数pの値(i): 2
今度は"warning"といわれずにすみました。
"a"と"i"がどのアドレスにあるのかを知ることができました!