📝

ポインタの使用を勉強するため問題を解いてみた

2025/03/13に公開
#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