公式アカウントからの投稿が始まります

ポインタ引数をさらに関数のポインタ引数として設定するには、
どうしたらよいのでしょうか?
イメージとしては、
int 関数A(*a *b)
{
*a = 5;
*b =3;
関数B(*a *b)

}

またポインタ引数の関数内で、
ポインタ指定せずに変数を使えるのでしょうか?
int 関数A(*a *b)
{
a = 5;
b =3;
関数B(*a *b)

}

A 回答 (4件)

例えば次のようにサーチして調べて下さい。



C言語 "ポインタへのポインタ"
C言語 仕様 ポインタ引数

次等が参考になると思います。
http://www.geocities.jp/debu0510/personal/c_poin …
C言語:ポインタ入門

>ポインタへのポインタ
>char **cpp;とかいうやつです。cppはcharへのポインタを指します。 int **ipp;ならintへのポインタを指します。

>ポインタへのポインタを使うと、 ポインタを参照渡しごっこすることが可能です。 関数内で指す場所を変えることが出来るのです
........
    • good
    • 0

誰しも、高水準な言語から、アドレスを直接意識しなければならない低水準な言語を学習する場合、少なからず混乱してしまうものです。

ご質問の内容からは離れますが、私自身の経験から「誰かがそう言ってくれたら直ぐにポインターが理解できたのに」と思う要点がありますので、ご紹介します。

まず、生成されるEXEやDLL内にソースコード中の変数名は存在しません。したがって、総ての変数はあるアドレスに値を格納するという表現がなされています。動作を構造化して管理しやすくする為に関数という書き方が存在する訳ですが、コンパイラにとっては厄介な仕事が一つ増えることになります。引数がvoid func(int a, int b)と記述された場合、呼び出し側の変数値を一旦別なアドレスへコピーして渡さなければならないからです。

これをコンパイラ側に優しい書き方にしたのが、アドレス渡しです。関数側はvoid func(int *a, int *b)という表現になりますし、呼び出し側に実体変数がある場合は、アドレスを渡しますのでfunc(&a, &b);になります。この場合コピーが発生しませんから、動作も高速になりますが、同じアドレスを参照していますから、変数に対する値の代入は呼び出し元へも影響を与えることに注意が必要です。

関数Aの引数がアドレス表記なら、関数スコープ中の変数はアドレスが格納された変数(ポインター)ですから、ご存知のとおり値を代入する場合 *a = 10;が必要になり、そこから更に呼び出す関数Bの引数がアドレスならそのまま渡せることになります。

もし、ご質問された方がMicrosoft Visual Studioのようにグラフィカルなデバッグ環境をお持ちでしたら、任意な行にF9でブレイクポイントを置き、クイックウォッチで変数がどのアドレスにどう格納されているのかを眺めることができますので、ぜひ一度ご覧になってください。

ご質問にお答えするような内容になっていませんでしたら、ご容赦ください。今後のご発展をお祈り申し上げます。
    • good
    • 0

言ってる意味が良く分かりませんね。


一つ目の質問は、良く分からないのですが、
関数Bでメイン関数で宣言した数値を変更したいとかそういう話でしょうか?
int 関数A(int *a,int *b)
{
*a = 5;
*b = 3;
関数B(a,b)
}
で、出来ます。
関数Bも同様にint 関数B(int *a,int *b)としてください。
このa,bは元々アドレスを格納してあるのでそのまま渡して問題ありません。
int *aとして宣言した場合の例として、
*a・・・指定されたアドレス先の中身
a ・・・アドレス
&a・・・アドレスのアドレス
となります。&aはint a[2][2]みたいな多次元配列を扱うときに使いますが、この場合はあまり関係ありません。


2つ目の質問ですが、やることは出来ます。一応。
多分考えているような動きはしてくれませんが。
関数Aの時点でメインから変数x,yを受け取ったとしましょう。
そのときa,bには、
a=xのアドレス
b=yのアドレス
が、格納されています。
これをa=5;やb=3;としてしまうと、元の値を参照できなくなってしまいます。
また、メモリ上ではどこに何が格納されているか分かりません。
a=5;としてしまうと他のプログラムに悪影響を及ぼす可能性もあります。
やるのであれば、メモリを確保するmallocやnewなどと併せて使うのが割と一般的かと思います。
    • good
    • 0

えーと、イメージのコードは C の構文としていろいろ抜けていますが、関数A(int *a, int *b) と 関数B(int *a, int *b) があって、関数A から 関数B を呼び出したい、ということでよろしいでしょうか。


ならば、
int 関数A(int *a, int *b)
{
*a = 5;
*b = 3;
関数B(a, b)
}
となります。

また、
> ポインタ引数の関数内で、
> ポインタ指定せずに変数を使えるのでしょうか?
について。
使えますが、あなたが思っているような動作にはなりません。
    • good
    • 0

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