LoginSignup
82
47

More than 5 years have passed since last update.

【C言語ポインタ】&(アンパサンド)や*(アスタリスク)の使い分け

Last updated at Posted at 2019-03-25

はじめに

C言語を始めて半年が経ちました。
変数やポインタの前につける &* 、たくさん出てくると今でも混乱しがちです…
というわけで、自分のための備忘録も兼ねて、軽くまとめてみたいと思います!

使い方

通常の変数

まずは、通常の変数の場合!
もし以下のようなコードの場合は、、

varSample.c
#include <stdio.h>

int main(void) {

    int var;
    var = 10;

    printf("printf  var  ... %d\n", var);
    printf("printf  &var ... %p\n", &var);

    return 0;
}
通常の変数
var 格納されている値を表示
&var 変数自身のアドレスを表示

となります。
実行して確認してみると、、

printf  var  ... 10
printf  &var ... 0x7ffeefbff588

このような結果になりました!
通常の変数には、値とアドレスの2つの要素があることが分かります。

ポインタの場合

続いて、ポインタの場合!
もし以下のようなコードの場合は、、

ptrSample.c
#include <stdio.h>

int main(void) {

    int var = 10;
    int *ptr;      // int型のポインタを宣言

    ptr = &var;    // ポインタptrに変数varのアドレスを格納

    printf("printf  var  ... %d\n", var);
    printf("printf  &var ... %p\n", &var);
    printf("\n");
    printf("printf  ptr  ... %p\n", ptr);
    printf("printf  *ptr ... %d\n", *ptr);
    printf("printf  &ptr ... %p\n", &ptr);

    return 0;
}
ポインタ
ptr 格納されている値(変数のアドレス)を表示
*ptr アドレスの先の値(実体)を表示
&ptr ポインタ自身のアドレスを表示

となります。
赤字で書かれている部分が、ポインタ特有の機能です。

こちらも実際に実行してみると、、

printf  var  ... 10
printf  &var ... 0x7ffeefbff588

printf  ptr  ... 0x7ffeefbff588
printf  *ptr ... 10
printf  &ptr ... 0x7ffeefbff580

このような結果になりました。
ポインタptrの値として、変数varのアドレスが入っていることが確認できます。

図で整理してみると、以下のようになります。

ポインタが通常モードの時は、対象変数のアドレスを”指し示して”います。
ポインタ特有の機能として、*を頭につけると「アドレスの先にある値」を"指し示す"ことができます。
*がつくと、矢印(ポインタ)がにゅーんと伸びるイメージです。
( *は間接演算子という名前が付いているので、間接モードと呼んでいます。)

終わりに

実は、今回の投稿が初投稿でした。
理解の一助となると幸いですm(_ _)m

82
47
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
82
47