20260414_3


ポインタについて

ポインタの線源と利用

変数はメモリ上の領域だった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);/*この方法なら入れ替えが可能*/