#始めに
この記事はC言語初心者がポインタの基礎についてまとめたものです。
###・まず
変数や配列などの領域は、メモリ上に保存されている。
メモリには、場所を表す**「アドレス」**という固定長(1バイトの大きさごとに1番地)
の数字の列がついている。
###・データ型によって確保される領域
・int:4バイト
※intが32ビット(4バイト)である環境として考える
宣言したint型の変数xが1000番地から確保されたとすると、
int型は4バイトのデータ型なので、確保されたxの領域は
1000番地から1003番地までのアドレスをまたいで4バイトの大きさになる。
#・ポインタ(変数)とは
変数や関数などが置かれたメモリ上の番地などを格納する変数のことです。
メモリ上に確保された領域の(始まりの)アドレスと大きさ(データ型)から
参照する。
ポインタ変数にはアドレスだけを格納することができ、数値や文字などの値を
直接格納することはできない。
###・ポインタ変数の宣言
データ型 *ポインタ変数名;
例:int *p;
この例は、
「int型のデータをしまう領域を参照するために使うポインタ変数」pを宣言していて、
ここで宣言された変数名pに「*」を付けて使うと「int」型の領域を表すことができる。
ここで「*」はポインタ変数を宣言することを示す**「宣言子」**である。
#・間接参照
ポインタ変数が特定の領域を参照しているとき、その特定の変数そのものをポインタ変数を使って表すこと。
ポインタ変数名 = &変数名;
例:int x; //int型変数xの宣言
int *p; //int型を被参照型とするポインタ変数pの宣言
p = &x; //ポインタ変数pに変数xの領域を参照させる
ポインタ変数pに変数xのアドレスを代入することによって、ポインタ変数pが
Int型変数xの領域を参照することができる。
ここでは、ポインタ変数pそのものにアドレスを代入するため、
**「*p=&x;」**と書いてはならない。
演算子「*」をポインタ変数の前に付けると、ポインタ変数が参照している特定の変数の
領域からその特定の変数そのものを表すことができる。
ここで、この演算子「*」を**「間接参照演算子」**という。
#include<stdio.h>
int main(void)
{
int x;
int* p; //ポインタ変数の宣言
x = 100;
p = &x; //ポインタ変数へ変数xのアドレスを代入
printf("x = %d\n", x); //変数xの内容
printf("*p = %d\n", *p); /*ポインタ変数による間接参照
ここでは変数xの値が表示される*/
printf("&x = %p\n", &x); //変数xのアドレス
printf("p = %p\n", p); /*ポインタ変数の値
ここでは変数xのアドレス*/
return 0;
}
※「%p」は、ポインタの値を出力する
###出力結果
x = 100
*p = 100
&x = 00AFFD0C
p = 00AFFD0C
#・まとめ
int *p;
「p」:変数のアドレスが代入される
「*p」:「p」に格納されているアドレスにある値を表示させる
#・最後に
今回はポインタの基礎を簡単にまとめてみました。
まだまだ分からないことだらけなので勉強を続けていきたいと思います。
最後まで読んでいただきありがとうございます。