プロが教えるわが家の防犯対策術!

ポインタ超初心者。
どこが間違ってますでしょうか⁈

#include <stdio.h>



int pointa(int *a)

{

a+=3;

return(*a);

}



int main(void)

{

int *number;

scanf("%d",&number);



printf("%p",pointa(number));



return 0;

}

A 回答 (4件)

入力した数に3を足して出力


という意図なら、ほぼ全面的に間違い。
メチャクチャといって良いです。
修正すると残る行は}と{とreturn 0 とmain()くらい(^-^;
    • good
    • 0

scanfで入力した数値に3を足して表示するプログラムだと推測しました。



#include <stdio.h>

void pointa(int *a) /* returnが無いのでvoid型*/
{
*a += 3; /* ポインタの指しているアドレスの値に3を足す*/
}

int main(void)
{
int number; /* int型変数 */
scanf("%d",&number); /* numberに整数を入力 */

pointa(&number); /* numberのアドレスをpointa関数に与える → numberに3を足す*/
printf("%d", number);

return 0;
}
    • good
    • 0

>どこが間違ってますでしょうか⁈



いろいろ間違ってます。

>int pointa(int *a)
>{
> a+=3;
> return(*a);
>}

引数で渡されたポインタからint型で3つ先に格納されている値を返します。
引数で渡されたポインタが配列とかでない場合は期待した動作をしないでしょう。

>int *number;
>scanf("%d",&number);

どこを指しているか不明なポインタに、『アドレスを10進数で入力』します。
かなり高い確率で入力したアドレスへのアクセスは蹴られるでしょうけど。

環境によっては死にます。
int型のサイズとポインタ変数のサイズが違う場合とか。

>printf("%p",pointa(number));

先の関数と合わせると…
入力したアドレスからint型3つ分あとにある値をアドレスとして(おそらく)16進数表記で出力します。
    • good
    • 0

間違っている、というのは「正しいもの」と比較しないとわかりません。



C言語としては「エラーにならない」という意味では「正しいプログラム」です。
やっていることは滅茶苦茶ですが、「滅茶苦茶なプログラム」が目的なら「正しいプログラム」です。

何をしようとしているのか?
それをどう考えて、このようなプログラムにしたのか?

それがわからないことには、「正解」もわかりません。


とりあえず、問題になりそうなのは

> a+=3;
aは「intへのポインタ」であり、 a+=3 とすることで、「aは最初のアドレスからint3つ分後ろのアドレス」になります。
> return(*a);
で、aのアドレスにあるintの値を返しています。
つまり、このプログラムは return a[3] ; とするのと同じです。

この引数a は、呼び出し側の変数のコピーになります。 a+=3 としたところで、この関数の中だけで、呼び出し側の変数には何に変化もありません。



> scanf("%d",&number);

%d に対応しているのは 「intへのポインタ(int *型)」です。
number はint *型なので、 &number は int ** 型になります。
型が一致しませんが、 scanf の場合、エラーにはなりません。


> printf("%p",pointa(number));

%pに対応しているのは ポインタ です。
pointa関数の戻り値は int です。
型が一致しませんが、 printf の場合、エラーにはなりません。
    • good
    • 0

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