C言語のアスタリスク(*)の意味を解説します【ポインタ、掛け算】
目次
C言語のアスタリスク(*)の意味
C言語ではアスタリスク(*)をキーワードとして使うことができます。
この記号にはちゃんとしたC言語の文法上の意味があります。
結論を言うとアスタリスクが表している意味は↓の3つです。
掛け算
ポインタ変数の宣言
ポインタ変数の実体へのアクセス
この記事ではこれらの意味について具体的に解説します。
関連記事
C言語の配列とは?その美しさを解説します
C言語のabs関数で絶対値を求める方法【abs, labs, llabs, imaxabs, fabs, fabsf, fabsl】
掛け算
C言語のアスタリスクは式の掛け算の記号としても使われます。
これは例えば「3 × 4」とか「12 × 2」とかの掛け算の記号です。
つまり「×」の代わりに「*」を使うわけですね。
C言語のコードでは例えば↓のようになります。
#include <stdio.h> int main(void) { int result = 3 * 4; printf("%d\n", result); // 12 return 0; }
上記のコードの「3 * 4」は掛け算です。
これは「3 × 4」と同じ意味になります。
この掛け算の結果は「12」になるので、↑のresult
変数には12が入ります。
このようにC言語のアスタリスクには掛け算の意味が含まれています。
少しややこしいんですが、アスタリスクには掛け算の他にも意味があります。
それが次で紹介するポインタ関連の意味です。
ポインタ変数の宣言
C言語のアスタリスクはポインタ変数の宣言をするときにも使われます。
たとえばint
型の変数は↓のように宣言します。
int a;
↑の場合、変数a
はint
型の変数になります。
ではint
型のポインタ変数を宣言するときはどうすればいいのでしょうか?
その場合は↓のように宣言にアスタリスクを付けます。
int *b;
こうすると↑の変数b
は「int
型のポインタ変数」になります。
ちなみにアスタリスクを2つにすると
int **c;
↑の変数c
は「int
型のポインタのポインタ変数」になります。
このようにアスタリスクを増やすことで意味を変えることができます。
C言語の掛け算とポインタのアスタリスクはともに同じ記号を使っています。
そのため初心者の方にはわかりづらいものになっています。
さらにポインタについては宣言で使うアスタリスクと、ポインタ変数の実体を参照するアスタリスクも意味が違います。
つまりC言語のアスタリスクには意味が3つ以上あります。
ここら辺はC言語が難しいと言われている理由の1つになりそうです。
ポインタ変数の宣言ですが、これは関数の引数にも使われます。
たとえばポインタ変数を引数として取りたい関数があったとします。
↓のような関数です。
void func(int *a) { }
上記の関数func
は引数を持っています。
それはint *a
がそうです。
これはint
型のポインタ変数a
を表しています。
ポインタ変数の実体へのアクセス
ポインタ変数の宣言にはアスタリスクを使ってましたが、ややこしいことにポインタの実体を参照するのにもアスタリスクは使われます。
「ポインタ変数の実体を参照する」とはどういうことでしょうか?
これは言い換えると「メモリ上のデータを参照する」ということになります。
ポインタ変数はメモリのアドレスを保存する変数です。
そしてそのアドレスを参照して、広大なメモリ領域の中にあるデータを見つけます。
この時にこのデータを書き換えたり、読み込んだりします。
この書き換えや読み込みを行うときにアスタリスクが使われます。
たとえば↓のコードを見てください。
#include <stdio.h> int main(void) { int a = 1; // int型の変数a int *b = &a; // 変数aのアドレスを持つポインタ変数b *b += 1; // メモリ上のデータの書き換え(aの値を書き換え) // メモリ上のデータの参照(aの値を参照) printf("%d\n", *b); // 2 b = NULL; // ポインタ変数bにNULLポインタを代入 return 0; }
↑の場合、最初に変数a
を定義しています。
この変数a
には値1
が保存されています。
そしてポインタ変数b
を作ってa
のアドレスを保存します。
*b += 1;
でポインタ変数b
にアスタリスクを付けています。
これはポインタ変数b
の実体を参照する、という意味です。
実体は変数a
のメモリになるので、この式では変数a
の値に1
が加算されます。
printf("%d\n", *b);
では、同じようにポインタ変数b
にアスタリスクを付けています。
こうするとポインタ変数b
の実体である変数a
の値を読みだすことができます。
printf()
は「2」と出力します。
これは先ほどの式(*b += 1;
)で変数a
の値に1加算されているからです。
コードの最後にb = NULL;
とやってポインタ変数b
にNULLポインタを代入しています。
ポインタ変数はアスタリスクを付けない場合はポインタ変数自体への処理になります。
NULLポインタは「何もない」空のアドレスになります。
このようにアスタリスクを付けずにポインタ変数に代入すると、そのポインタ変数が持つアドレスを変えることができます。
このようにポインタ変数はアスタリスクの文脈によって意味が変わります。
ここら辺はC言語の難しいところだと思います。
おわりに
今回はC言語のアスタリスクが持っている意味について解説しました。
C言語のアスタリスクは3つ以上の意味が含まれています。
初心者の人は落ち着いて1つずつ意味を理解していってください。
(^ _ ^) | アスタリスクは3つに化ける |
(・ v ・) | 妖怪変化C言語 |