目的
ダブルポインタについて、理解を深める。
内容
- ポインタの概要
- メモリのアドレスを操作するものである
- ポインタにおいて、*ありと*なしの例を示す
- *pi:piが指している先のアドレス
- pi:pi自身のアドレス
- ダブルポインタの概要
- ポインタへのポインタであり、シングルポインタの中身にアクセスするものである
- シングルポインタの指す動的メモリにアクセスできることにより、シングルポインタを書きかえて、メモリの変更を行う手間を省くことができる
ダブルポインタによる動的メモリを確保する関数の例を下記に示す。
- **arr:*arrのポインタ
- *arr:int型のポインタであり、アドレスを指す
- malloc:int型のポインタでキャストした、int型の大きさ(4バイト)×サイズ分のメモリの先頭アドレスを返す
#include <stdio.h>
#include <stdlib.h>
void* allocateArray(int** arr, int size, int value){
*arr = (int*)malloc(size * sizeof(int));
if(*arr != NULL){
for(int i = 0; i < size; i++){
*(*arr+i) = value;
printf("%d\n", **arr);
}
}
}
int main(){
int* vector = NULL;
allocateArray(&vector, 5, 45);
free(vector);
return 0;
}
プログラムの流れを説明する。
- メイン関数
- vectorポインタを定義
- vectorポインタのアドレス,size,valueを引数にもつallocateArray関数を呼び出す
- vectorポインタの解放
- allocateArray関数
- arrポインタにmallocで確保した動的メモリの先頭アドレスを代入
- arrポインタの指す先がNULLでない場合、(arrポインタ+i)へのポインタにvalueを代入する
- arrポインタへのポインタを出力する
- iがsizeと同じになるまで2,3を実行する
各ポインタの関係性を表1に示す。
vectorポインタは自身のアドレスを渡すことにより、mallocの先頭アドレスにアクセスできる。
所感
シングルポインタにポインタをつけること(ダブルポインタにすること)により、メモリを確保したシングルポインタにアクセスできることは、便利だと感じた。
参照
詳説Cポインタ P73,74