パハットノート

主にUnity(C#)を中心としたプログラムの備忘録

C言語 アドレスとポインタ





アドレスについて

&変数名」によりその変数がメモリ上のどこに保存されているか取得することができる。

#include<stdio.h>
int main(void)
{
	int a = 2, b = 5;
	printf("aのアドレス:%p\n", &a);
	printf("bのアドレス:%p\n", &b);
	return 0;
}
実行結果(実行するたびに変わる)
aのアドレス:0x7ffe03cf0cb4
bのアドレス:0x7ffe03cf0cb0



*型変数

変数宣言において変数の前に「*」をつけることができる(以下*型変数とよぶ)。
*型変数は「変数名」がアドレスを示し、「*変数名」でそのアドレスに保存されている変数を表示する(エイリアス)
下のプログラムでは*型変数aについてアドレスにint型変数bのアドレスを代入することで*aがbと等しくなるようにした。

#include<stdio.h>
int main(void)
{
	int* a;
	int b = 5;
	a = &b;
	printf("aのアドレス:%p\n", a);
	printf("aに格納されている数値:%d\n", *a);
	printf("bのアドレス:%p\n", &b);
	printf("bに格納されている数値:%d\n", b);
	return 0;
}
実行結果
aのアドレス:0x7ffd6274843c
aに格納されている数値:5
bのアドレス:0x7ffd6274843c
bに格納されている数値:5





プログラム例

int型配列の合計と平均を求めるプログラム

#include<stdio.h>

#define N 5


void Func(int a[N], int* sum, double* ave)
{
	*sum = 0;
	for (int i = 0; i < N; i++)
	{
		*sum += a[i];
	}
	*ave = (double)*sum / N;
}

int main(void)
{
	int a[N] = { 2,5,6,1,3 };
	int sum;
	double ave;
	Func(a, &sum, &ave);
	printf("合計:%d, 平均:%f", sum, ave);
	return 0;
}
実行結果
合計:17, 平均:3.400000