童貞のプログラミング

童貞の頭の中を垂れ流します。

C言語のポインタについて 1.そもそもポインタとは何か?

C言語のポインタについて

最近C言語を勉強していて、ポインタが難しかったので
自分用に要点をまとめてみました。

 

まずポインタを理解するために大きく4つに分けてみました。
1.そもそもポインタとは何か?
2.ポインタで出てくる&と*はなに?
3.宣言する型が違う場合どうなっているのか?
4.ポインタのポインタとは?

今回は、1つ目のそもそもポインタとは何か?に触れてみようと思います。

 

※私自身がポインタを完全に理解しているわけではないので
修正点がありましたらその都度追記すると思いますのでご了承ください。

 

目次

 

ポインタとは

まずポインタとは何でしょうか。

wikipediaには以下のように書かれています。

ポインタ (pointer) とは、あるオブジェクトがなんらかの論理的位置情報でアクセスできるとき、それを参照する(指し示す)ものである。

(https://ja.wikipedia.org/wiki/ポインタ_(プログラミング))

簡単にまとめると
変数の値の格納場所(アドレス)を表すときに使うものです。

一応、概要を説明しますと、
パソコンがプログラムを処理するときをメモリというものを使います。
メモリとは変数の値を一時的に保存しておくものです。
そのメモリの中のどこに変数の値を格納したか(アドレス)をポインタを使うことでわかります。


要はパソコンも人間と同じように物事を考えるとき(プログラムを処理するとき)一時的に考えたことをメモ(メモリに保存)します。
その時、メモの何ページ(アドレス)に書いたかがポインタという方法を使うとわかるだけです。

 

ポインタを使うことで、処理の高速化やパソコンへの処理の負荷を軽減などすることができます。
また、ポインタを使うことで複雑な処理もできるようになります。


それでは実際にプログラムを使って考えてみようと思います。

 

 

実際に動かす

Case1.普通の変数の宣言、代入、出力


まず、普通の変数を宣言、代入、出力をしてみようと思います。

※このプログラムはこれからのプログラムのベースになるものなのでこれ自身はポインタをまだ使用していません。

f:id:SitimiMayo:20210102202953p:plain

Case1のコーディング

結果

f:id:SitimiMayo:20210102203147p:plain

Case1の結果

プログラム通り、Aの中に1という値を入れているので
出力結果は1となります。


Case2.変数Aのアドレスをみる


次に、変数Aのアドレス(メモの何ページか)を見てみようと思います。
やり方は以下のように出力する時、変数に&を追加すれば見れます。この時出力フォーマットはpを選んでください。

※%p以外を指定した場合でも値が出ますが違います。
printf("%p\n",&A);

 

f:id:SitimiMayo:20210102203046p:plain

Case2のコーディング

結果

f:id:SitimiMayo:20210102203151p:plain

Case2の結果

出力結果は

1

0x7ffca93e5684

となりました。

 

1行目はCase1の時の変数Aの値で、2行目はその変数Aのアドレス(メモの何ページか)です。

これは、人間では理解できませんがパソコンはこの表記で理解しています。
※このアドレスの出力結果は毎回違う値が出てきますのでこのテストと違う値が出ていても問題ありません。

 

Case3.ポインタ変数の宣言、代入、出力

続いて、ポインタ変数の宣言、代入、出力です。
先程までは、変数Aのアドレスを出力だけしました。
そうではなく、ポインタ変数を宣言、代入、出力をしてみようと思います。


1.ポインタ変数の宣言は、宣言時に*を変数の前につけるだけ

(これで、アドレスを格納する変数を宣言します。)

※今回int型のみでテストを行っていますが他の型でも同じ要領でコーディングします。

【例】目的の型 *変数名;

   int *A_p;


2.ポインタ変数の代入は、代入時にアドレスを知りたい変数(今回だとA)の前に&をつける

(これで変数Aのアドレスをポインタ変数A‗pに格納しました。)

【例】アドレスを格納する変数 = &アドレスを知りたい変数;
   A_p = &A;


3.ポインタ変数の出力は出力フォーマットに%pを指定

今回はA_pでいいです。&A_pとは書きません。

(これで、出力した際ポインタ変数A‗pを出力することができます。)

【例】printf("%p\n",アドレスを格納する変数);

   printf("%p\n",A_p);

 

f:id:SitimiMayo:20210102203136p:plain

Case3のコーディング

結果 

f:id:SitimiMayo:20210102203155p:plain

Case3の結果

 

出力結果は

1

0x7fffb4d4643c

0x7fffb4d4643c

となりました。

 

1行目はCase1の時の変数Aの値で、2行目はその変数Aのアドレス(メモの何ページか)です。

そして3行目は2行目と同じ値が入ります。これは、変数代入の際に&A(Aのアドレス)を指定しているためで、出力時の2行目と3行目が同じ値がとなります。

 

※先程も記載しましたが、このアドレスの出力結果は毎回違う値が出てきますのでこのテストと違う値が出ていても問題ありません。また、テストするたびに値が変わることもあります。

 

 

これで、本当に最低限のポインタを使うぐらいはできるはずです。

残りの3項目は後日また追加していこうと思います。

 2021年1月29日、残りの3項目追加しました。