ショウのプログラミング教室

【初心者必見】簡単に理解できるC言語のメモリとポインタの入門

こんにちはショウです
C言語で一番多くの人がつまずくのがメモリについてです
そんなメモリの使い方を簡単に説明します

使い方がわかればいい

メモリまで順調だったけど、メモリがわからないからプログラミング自体をやめる
なんてモッタイない!!
結論からいいますと、メモリの仕組みはわからなくても使えればプログラムは作れます
もちろん仕組みまで100%理解できた方がいいプログラマになれますが
駆け出しのプログラマは仕組みまで理解できなくても大丈夫です
どんな時にどう使えばいいかだけ押さえておきましょう

仕組みは難しい

C言語メモリでググると多くのサイトがでてきます
いろんな人がメモリの難しい内容について詳しく書いてくれています
でも、仕組みからすべて理解しようとすると大変です
そこで私は簡単に使い方だけ紹介します

メモリの使い方

メモリの操作は主に領域の確保参照(ポインタ)だけです
では具体的にみていきましょう

領域の確保

関数内で一時的に大きな領域を使用する場合
確保する領域のサイズを引数で指定する

void hoge(int size){
 //関数の引数で設定されたサイズ分の領域を確保
 char* buff = malloc(size);
 //
 //なにかしらの処理
 //
 //領域の解放
 free(buff);
}

処理結果により必要なサイズが異なる場合
確保する領域のサイズを変数で指定する

int main(){
 //仮に自作の関数で指定されたファイルのサイズを取得
 int size = GetFileSize("FileName");
 //ファイルサイズ分の領域を確保
 char* buff = malloc(size);
 //
 //何かしらの処理
 //
 //領域を解放
 free(buff);
}

領域の参照

関数の内部で引数の値を変更したい場合
関数の引数に変数のポインタをいれる

int main(){
 //変数を定義 
 int val = 1;

 //変数名に&をつけるとポインタとなる
 hoge(&buff);//buffが+1される 
}

//関数の定義は変数名に*をつける
void hoge(int *val){
  //引数を+1する
 *val++;
}

関数の内部で配列を使用する場合
配列の添え字なしで指定すると変数のポインタとなる

int main(){
 //配列を定義 
 int buff[100];
 //int配列の各要素に値を格納
 for(int i=0; i < 100; i++){
  buff[i] =  i; 
 }
 //配列の場合は添え字[]なしで指定すればポインタとなる
 hoge(buff);
}
int hoge(int *val){
  //配列の中身を表示
  for(int i=0; i < 100; i++){
  printf("val[%ld] = %ld", i, val[i]);
 }
}

まとめ

どうでしたか?使うだけなら簡単でしょう?
今回はメモリの初歩的なことについて紹介しました
中級編はまたの機会に

モバイルバージョンを終了