Edited at

C言語ポインタの基礎

More than 3 years have passed since last update.

C言語のポインタを理解したい

はじめに、これは個人的に学習したものをメモってみたものです

最近、javaやC#といった言語にはGC機能がありメモリ管理をする必要がなくなってきました

ですがOSでも作りたい、組み込みのプログラムを作りたいと言った時に

避けては通れないのがC言語

別のプログラミング言語を習得している人にとってはこれがまた厄介で

C言語を習得するにはポインタという普段はまず使わない機能を理解する必要があります

ポインタの前に

ポインタの前に、ポインタを理解する上で理解する必要のあるものがひとつあります

それはアドレスです。

もっと簡単に言うならメモリの場所です。

プログラムを作成する際に変数などを作成すると

その変数はデータ型に応じて、必要な分だけメモリ上の場所を確保します

これはC言語に限らずどの言語でも言えることなので覚えていて損はないでしょう

C言語ではこのアドレスの場所を変数に「&」記号をつけて表現します

ちなみに&をアドレス演算子と言います


#include<stdio.h>

int main(){
int a = 0;
printf("変数aのアドレスは%d",&a);
return 0;
}

じゃあポインタって何?

アドレスはわかった。じゃあ、ポインタってなんのためにある?

その答えは簡単、アドレスの場所を変数に代入するためです

そしてアドレスを格納してる変数を「ポインタ」と言います

さっきのコードで変数aのアドレスは&aとしました

では&aで表すアドレスをポインタに代入してみましょう


#include<stdio.h>

int main(){
int a = 0;
int* pa;//ポインタを宣言

pa = &a;//これでポインタにアドレスを代入する
*pa = 1;//aのアドレスに1を代入、つまりaに1を代入することと同じ
return 0;
}

たったこれだけです。

上記のコードで示したようにポインタの宣言は

変数の型の末尾にをつけるか

変数名の先頭に
をつけることで宣言できます

またさっきと同じように「*」をポインタ演算子と言います

それとポインタを宣言した場合には必ずアドレスを代入しましょう

普通のコンソールプログラムならコンパイルエラーか警告になります

しかしexeで実行ファイルになっている場合にはそれを実行してはいけません

未定義のポインタに値を代入するということはとても危険なことでシステム自体を破壊してしまうかもしれないからです

ポインタのポインタ

実はポインタのポインタも取ることも可能です


#include<stdio.h>

int main(){
int a = 0;
int* pa;//ポインタを宣言
int** pp;//ポインタのポインタを宣言

pa = &a;//これでポインタにアドレスを代入
pp = &pa;//ポインタのアドレスを代入
**pp = 1;//pのアドレスに1を代入、つまりaに1を代入することと同じ
return 0;
}

最後に

ポインタの概念は理解できたでしょうか?

まだわからないという方

イメージとしてはjavaでいうならC言語のポインタとは、参照と似ています

例えばjavaで


int[] a = {1,2,3,4,5};
int[] b;

b=a;

といったコードを書いたとします

b = a で配列aのアドレスを配列bに渡すので必然的にa,bが同じ値になります

なので、どちらか一方を変更するともう一方も変更されます

ポインタはこれと同じ考えです