プロが教える店舗&オフィスのセキュリティ対策術

swap関数のprintf("変数名naアドレスは%pです。\n", nx);
printf("変数名nbのアドレスは%pです。\n", ny);のnx, nyは、&nx, &nyとしなくていいのですか?同様にswap関数のn1,n2に関しても宜しくお願いします。あと、swap(n1,n2)もどうして&をつけないか教えてください。


#include <stdio.h>

void swap (int *nx, int *ny)
{
int temp = *nx;

printf("変数名naアドレスは%pです。\n", nx);
printf("変数名nbのアドレスは%pです。\n", ny);

*nx =*ny;
*ny = temp;
}

void sort2 (int *n1, int *n2)
{
printf("変数naのアドレスは%pです。\n",n1);
printf("変数nbのアドレスは%pです。\n",n2);

if (*n1 >*n2)
swap (n1, n2);
}
int main(void)
{
int na, nb;

puts("二つの整数を入力してください。");

printf("整数A:"); scanf("%d", &na);
printf("整数B:"); scanf("%d", &nb);

printf("変数naのアドレスは%pです。\n",&na);
printf("変数nbのアドレスは%pです。\n",&nb);

sort2 (&na, &nb);


return (0);
}

A 回答 (2件)

printf 関数の%p の指定は引数にポインタを要求するというものです。


>printf("変数名naアドレスは%pです。\n", nx);
のnx は、ポインタですから、そのうえに&を付ける必要はありません。
>swap (n1, n2);
についても
その定義
>void swap (int *nx, int *ny)
でポインタを要求すると言うようになっていますが、
>void sort2 (int *n1, int *n2)
で n1,n2 は、(既に)ポインタとして宣言されていますからそのままで(ポインタだから)良いです。
>printf("変数naのアドレスは%pです。\n",&na);
の場合は、
na は、ポインタではなく、int ですから、アドレスにしてやる必要があります。
    • good
    • 0

ポインタが良く理解できていないようですね。

ポインタは難しいところですが、覚えると簡単ですのでがんばってください。

*をつけたり、&を付けたり、付けなかったり…、一度整理してみるとわかりやすくなります。

■普通のケース
int x;
 x ← xの値
 &x ← xのアドレス
 *x ← こんな書き方はありません。

■ポインタ
int *p;
 p ← pのアドレス(ポインタ)
 &p ← こんな書き方はありません。
 *p ← pの値(ポインタが指している先の値)
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!