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

よく言われていることがですが、フォートランは参照渡し、Cは値渡し、C++,Pascalは両方アリ、という説明がありました。参照渡し か 値渡しか は、行った先の関数内での値の変更が呼び出し元に反映されるかどうかってということではないかと思います。Cの場合はポインタでアドレスの値を渡すと呼び出し先の変更が呼び出し元に反映されるから結果的に参照渡しと同じ効果は可能なのかな(すなわち両方アリ)と思いますが、違うでしょうか。

A 回答 (7件)

批判的な意味ではなくて、


なんか、プログラムに慣れておられない質問という感じがします。
言語における参照渡し、値渡しを、整理する必要が出ているのでしょうか?何かの課題??
    • good
    • 1
この回答へのお礼

回答ありがとうございます。”慣れる”ということは理屈云々というよりも実際の仕様としてそうなっているということですね。CとFortranで考えていますが、仕様が真逆になる可能性だってあったかもしれませんね。つまりそう覚えるしかない、そう慣れるしかないのだ、ということなのだろうと思います。なぜ?などと考えているから習得が遅れるのだろうと思います。

お礼日時:2018/12/27 02:23

>Cの場合はポインタでアドレスの値を渡すと呼び出し先の変更が呼び出し元に反映されるから結果的に参照渡しと同じ効果は可能なのかな(すなわち両方アリ)と思いますが、違うでしょうか。



結果はその通りなので、同じような効果は得られます。

ただ、C言語では、ポインタという「場所を表す値」が渡されるにすぎません。この値は、呼び出し先の関数内ではローカル変数と同じ扱いができますので、呼び出し先関数内で自由に値を変更することもできます。ただ、「引数であるポインタ変数自体の値」を変更(たとえば、void func(char *a) { a = NULL; })しても、当然呼び出し元で保持している値には影響しません。
    • good
    • 0
この回答へのお礼

回答ありがとうございます。Cでアドレスの値を渡した後でそのアドレスに格納されている変数を変化させる方法が単純に値(アドレス)を変更しただけではダメなので参照渡しとは言えないのだと理解しました。参照渡しと同じ効果が得られるとしてもですね。

お礼日時:2018/12/20 09:09

引数の渡し方と、関数の動作とは分けて考えるべきだと思っています。



値渡しを使って、呼び出し元の状態を変化させる、というのはよくあります。
それを「参照渡し」と読んでしまうと、本来の参照渡しと混同してしまい、扱いを間違えてしまいそうです。


例えば、Javaで

void methodA(classA a) {
a.memberA=1 ;
}

ってメソッドでも
methodA(b) ;
の後は
b.memberA == 1
になっています。
    • good
    • 0

「結果的に参照渡しと同じ効果が得られる」だけで, 厳密には値渡ししかないけどね. 言葉遊びだといえばそうだけど.



ちなみに今の Fortran では値渡しもできるってさ.
    • good
    • 0

いえ、Cは値渡ししか出来ません



仰るようにアドレスを渡してやれば、確かに読み出し元の値を書き換え、結果として参照渡し相当が実現できます
しかしこれは結果に過ぎません
この場合は、あくまでアドレスを渡したのであって、値は渡していませんよね

参照渡しなら、値であれ、アドレスであれ、渡したデータを呼び出し先で書き換えたら、それが呼び出し元に反映されます
値渡しではそうなりません
    • good
    • 0

呼び出した関数で、パラメータとして渡されたポインタの


指すアドレスの内容は、変更しない方が良いです。

やり方としては、呼び出された関数で領域を確保し、
そこに、値を入れ、関数の戻り値として、その領域の
ポインタを返しましょう。
    • good
    • 0

> Cの場合はポインタでアドレスの値を渡すと呼び出し先の変更が呼び出し元に反映されるから



「呼び出し先の変更が呼び出し元に“反映”される」というのはちょっと理解の仕方が違うかと。。。
ポインター渡しというのは呼び出し側が確保しているメモリー領域のアドレスを示して「そちらでの処理結果をこちらが確保しているこの場所へセットしてください」とするものです。
つまり呼び出し先が呼び出し元が保持している領域へ直接値をセットしています。

参考まで。
    • good
    • 1

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