📝
ポインタの使用を勉強するため問題を解いてみた
#include <stdio.h>
typedef struct{
float x;
float y;
}Vector2D;
int main(int argc, char** argv){
Vector2D v1,v2;
printf("v1.x=");
scanf("%f",&(v1.x));
printf("v1.y=");
scanf("%f",&(v1.y));
printf("v2.x=");
scanf("%f",&(v2.x));
printf("v2.y=");
scanf("%f",&(v2.y));
printf("(%f,%f)+(%f,%f)=(%f,%f)\n",v1.x,v1.y,v2.x,v2.y,(v1.x+v2.x),(v1.y+v2.y));
return 0;
}
上記コード実行結果
v1.x=1.0
v1.y=1.0
v2.x=2.0
v2.y=3.0
(1.000000,1.000000)+(2.000000,3.000000)=(3.000000,4.000000)
を、、、
ポインタpを使用して、下記の出力結果にするという問題。
v1.x=1.0
v1.y=1.0
v2.x=2.0
v2.y=3.0
(1.000000,1.000000)+(2.000000,3.000000)=(3.000000,4.000000)
(1.000000,1.000000)-(2.000000,3.000000)=(-1.000000,-2.000000)
下記コードが回答↓
#include <stdio.h>
typedef struct
{
float x;
float y;
} Vector2D;
int main(int argc, char **argv)
{
Vector2D v1, v2;
Vector2D *p1 = &v1, *p2 = &v2; // ポインタ変数を定義
printf("v1.x=");
scanf("%f", &(p1->x)); // ポインタを使ってアクセス
printf("v1.y=");
scanf("%f", &(p1->y));
printf("v2.x=");
scanf("%f", &(p2->x));
printf("v2.y=");
scanf("%f", &(p2->y));
printf("(%f,%f) + (%f,%f) = (%f,%f)\n",
p1->x, p1->y, p2->x, p2->y, (p1->x + p2->x), (p1->y + p2->y));
printf("(%f,%f) - (%f,%f) = (%f,%f)\n",
p1->x, p1->y, p2->x, p2->y, (p1->x - p2->x), (p1->y - p2->y));
return 0;
}
修正点
・ Vector2D *p1 = &v1, *p2 = &v2; でポインタ変数を定義。
&(アドレス演算子)v1でv1のアドレスを代入。
&v1を渡すことにより元のv1を変更できる(ポインタ p1 が v1 を指す)
※C言語では、構造体のデータを 「直接渡す」のではなく「ポインタで渡す」 ことが多い。
・p1->x で v1.x にアクセスできる
Discussion