ユーニックス総合研究所

  • home
  • archives
  • c-asterisk-imi

C言語のアスタリスク(*)の意味を解説します【ポインタ、掛け算】

  • 作成日: 2022-06-01
  • 更新日: 2024-03-24
  • カテゴリ: C言語

C言語のアスタリスク(\*)の意味

C言語ではアスタリスク(*)をキーワードとして使うことができます。
この記号にはちゃんとしたC言語の文法上の意味があります。

結論を言うとアスタリスクが表している意味は↓の3つです。

  • 掛け算
  • ポインタ変数の宣言
  • ポインタ変数の実体へのアクセス

この記事ではこれらの意味について具体的に解説します。

関連記事
C言語のポインタをC言語歴17年が解説
C言語のポインタの宣言と初期化方法
C言語のポインタのメリットとは?コピーしますかメモリを共有しますか

掛け算

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;  

↑の場合、変数aint型の変数になります。

ではint型のポインタ変数を宣言するときはどうすればいいのでしょうか?
その場合は↓のように宣言にアスタリスクを付けます。

    int *b;  

こうすると↑の変数bは「int型のポインタ変数」になります。

ちなみにアスタリスクを2つにすると

    int **c;  

↑の変数cは「int型のポインタのポインタ変数」になります。
このようにアスタリスクを増やすことで意味を変えることができます。

C言語の掛け算とポインタのアスタリスクはともに同じ記号を使っています。
そのため初心者の方にはわかりづらいものになっています。

さらにポインタについては宣言で使うアスタリスクと、ポインタ変数の実体を参照するアスタリスクも意味が違います。
つまりC言語のアスタリスクには意味が3つ以上あります。
ここら辺はC言語が難しいと言われている理由の1つになりそうです。

ポインタ変数の宣言ですが、これは関数の引数にも使われます。
たとえばポインタ変数を引数として取りたい関数があったとします。
↓のような関数です。

void func(int *a) {  
}  

上記の関数funcは引数を持っています。
それはint *aがそうです。
これはint型のポインタ変数aを表しています。

関連記事
C言語のポインタの宣言と初期化方法

ポインタ変数の実体へのアクセス

ポインタ変数の宣言にはアスタリスクを使ってましたが、ややこしいことにポインタの実体を参照するのにもアスタリスクは使われます。

「ポインタ変数の実体を参照する」とはどういうことでしょうか?
これは言い換えると「メモリ上のデータを参照する」ということになります。
ポインタ変数はメモリのアドレスを保存する変数です。

そしてそのアドレスを参照して、広大なメモリ領域の中にあるデータを見つけます。
この時にこのデータを書き換えたり、読み込んだりします。
この書き換えや読み込みを行うときにアスタリスクが使われます。

たとえば↓のコードを見てください。

#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つに化ける

🐭 < 妖怪変化C言語