2021-06-04 · 2

C ポインタ

ctil

この記事は公開から2年以上経過しています。

C、C++ ポインタ


ポインタとは?

特定のメモリの位置を指すようにした変数をポインタ(pointer)といいます。つまりアドレスを知ってこそ使えます。

私たちは今まで変数を宣言すると、その変数がメモリに記録されるとは考えず、その宣言した名前と値だけを考えて使ってきました。しかし実際に int a; と宣言するとき、'メモリ x132453647(任意)に int 型、変数名 a、初期化されていない状態で使う' というのと同じです。このとき a = 10; と入力すると、'メモリ x132453647 にある値を 10 に変える' というのと同じです。

なので私たちがポインタを使うということは、'名前が a' の変数を探すのではなく、'メモリ x132453647(任意)' を探せということです。アドレスが分かれば当然、値も分かるはずです。

ポインタの宣言!

ポインタもまた、既存の変数を宣言していたのと非常に似た見た目です。データ型も int、float、double、long、char などが存在します。変数と同じように宣言し、途中に * だけ入れればよいです。

例えば

//int 型ポインタ
int *a;

//float 型ポインタ
float *a;

//double 型ポインタ
double *a;

上のように宣言できる。

ポインタの宣言と初期化 — どうすれば宣言とともに初期化ができるでしょうか?私たちが "scanf" を学ぶとき "&" という記号を使った記憶はありますか?まさにこの "&" 記号がアドレスを教える記号です。

例えば

#include <stdio.h>

int main() {
    int num1 = 5;
    int num2 = 10;
    int *num1Ptr = &num1;
    int *num2Ptr = &num2;

    printf("%d %d\n", num1, *num1Ptr);
    printf("%d %d\n", num1, num1Ptr);
}

/*
出力:5  5
      10 10
*/

上のようにできる。少し説明すると、int 型変数 num1、num2 を宣言後、int 型ポインタ num1Ptr、num2Ptr も宣言し、

int* num1Pointer = &num1;

int * num1Pointer = &num2;

を入力すると、それぞれ num1 と num2 のアドレスを受け取るのが確認できます。その結果、num1 値と *num1Ptr の値が同一に出力されるのが確認できます。

注意!

int 型ポインタ int* p を宣言したとき、p = &num1、つまり int 型ポインタである変数 p の値に num1 変数の値を代入したとき、

printf("%d", *p) のように p に * を付けて使うと、p が指すアドレスにある値を表し、

printf("%d", p) のように p だけ使うと、p が指しているアドレスを表します。


原文(韓国語): tistory — 2021-06-04 公開、当ブログへ移行。この翻訳は AI の協力で作成されました。

コメント

コメントを削除しますか?

関連記事

C ポインタ · 나봄하랑