ポインタについて
ポインタの線源と利用
変数はメモリ上の領域だった20260414_3
→変数のアドレスを指定する必要性
ポインタって?
アドレスを格納する変数←超本質らしい
int a; /*int型の変数*/ int *ptr; /*int型へのポインタ変数*/ポインタの線源には対応する型に
*を付けて表現
ポインタで変数を指す
a = 10; ptr = &a; /*&aは変数aのアドレス*/
ポインタがさす変数に値を代入
ptr = &a;/*ptrに変数aのアドレスを代入*/ *ptr = 20;/*ptrの指す変数に値を代入*/
なぜポインタが必要?
- 変数は一つの核の場所しか参照できない
- ポインタ変数では格納するアドレスを変えることで複雑なデータ構造を実現
x = x+1;
/*左辺はアドレス、右辺は値のイメージ*/int *ptr;/*ポインタのptr*/
int* ptr;/*ポインタのptr*/
int a,*ptr;/*intのa、ポインタのptr*/
int* ptr,a;/*intのa、ポインタのptr*/…変数名にアスタリスクをつけるほうが安全そう
int **ptr2; /*ポインタへのポインタ*/
ptr2 = &ptr; /*pポインタ変数のアドレスを代入*/
**ptr2 = 180;/*ptrの参照元に代入*/エイリアスとして扱って良さそう
配列/構造体とポインタ
int array[10];
int *p;
p = array;配列名はポインタと同様に扱える(配列で確保されている目盛り上の連続領域の先頭へのポインタ)
ポインタに加算することは配列の添字を1ずらすのと同じ(添字演算子p[n]=*(p+n)の考え方)、ポインタ変数は変数だが、配列名の指すアドレスは書き換えが不可能である
struct array{
int elem [SIZE];
int n;
}
sturuct array data;
struct array *p =&data;
(*p).elem[5] =10;
(*p),n =3;
p -> elem[5]=10;
p -> n=3;
/*上下の代入は同じ*/実行時のメモリ
配列のサイズはプログラミングのときに決める必要がある
処理の途中で割当を変更できないか?
void *malloc(size_t size);指定されたメモリサイズを確保(memory allocation)
int *p;
p = (int*) malloc (sizeof(int)); /*voidをキャストしてint一つ分の目盛り領域を確保*/
*p = 100;キャストの使用には注意が必要
p = (int*)malloc(sizeof(int)*SIZE)/*SIZE個分のメモリを動的に確保*/
for (i=0;9<SIZE;i++){
p[i]=i+1
}引数の参照渡し
値渡し
void swap(int a,int b){
int tmp;
tmp = a;
a = b;
b = tmp;
}
int i,j;
swap(i,j);/*swapの中でしか値の入れ替えが怒らないのでiとj入れ変わらない*/参照渡し
void swap(int *a, int *b){
int tmp;
tmp = *a;
*a = *b;
*b = tmp;
}
int i,j
swap(&i,&j);/*この方法なら入れ替えが可能*/