26

私はこれを言うC++の本を読んでいます:

C ++は、参照によって配列を関数に渡します。呼び出された関数は、呼び出し元の元の配列の要素値を変更できます。

これは、次のような状況を指します。

int hourlyTemperatures[ 24 ]; 
modifyArray( hourlyTemperatures, 24 );

ただし、これはここで機能しているバニラC配列ポインターですよね?C ++の「参照」手法は使用されません。渡されるのは、値によるポインター、この場合は配列の最初の要素へのポインターです。最終的な結果として、関数は参照のように元の配列全体にアクセスできますが、これは実際には参照によって渡されませんよね?

このプレンティスホールの本から: 問題の本

4

3 に答える 3

19

配列を関数に渡すとき、実際にはポインタを値渡ししていることは事実です。しかし、C++ を学んでいるだけの人は、ポインターについてまったく心配する必要はないと思います。彼らは、値または関数への参照によって変数を渡すことができることを学びます。

値によるとは、関数内の変数への変更が、呼び出し元の関数内の元の値に影響しないことを意味します。

参照により、関数が変数の値を変更すると、それらの変更は元の呼び出し関数で見られることを意味します。

配列が関数のパラメーターである場合 ( const キーワードなし)、配列内の値に加えられた変更は、元の呼び出し元の関数に表示されます。したがって、配列はデフォルトで参照によって渡されると言います。これにより、静的に宣言された配列を渡すのに実際にはあまり関係のないポインターが何であるかを説明する必要がなくなりますが、呼び出された関数の配列の値をいじると、それらの変更が呼び出し元の関数に保持されることを人々に知らせることができます.

私は一流の工学学校で「第 1 コース」のコンピューター サイエンス C++ コースを教えています (私たちのプログラミング チームは、今年ロシアで行われる世界大会に出場します)。クラスの約 90% は、実際にはコンピューター関連の専攻ではありません (主に機械エンジニア)。上記の資料は、ポインターが何であるかを説明しなくても、混乱させるのに十分すぎるほどです。それが、その本や他の人が配列が参照渡しであると述べている理由です。本を読んでいる多くの人は、細かいことをすべて学ぶ必要なく、配列を取得するのに「ちょうど十分な」C++ が必要だからです。本当にプログラミングしたい人は、配列が実際にポインターによって渡されるという事実に移行するのに問題はないはずです。

あくまで私の意見ですが。

于 2013-04-03T23:28:21.250 に答える
17

あなたが正しい。言葉遣いは非常に紛らわしく、同じ名前の C++ 機能に関連する用語の参照とは異なる「参照」の意味を使用しています。代わりに、配列名がポインターに減衰する方法について話しています。実際、このように「配列を渡す」ことはまったくありません。

「昔」では、「参照」は「ハンドル」と同じように、より一般的な意味で使用されていました。これは、間接参照をサポートしていない言語で参照によるセマンティクスを偽造するための間接的な使用を表す抽象的な用語です。しかし、C++参照と呼ばれるものをサポートしています。したがって、C++ について話すときは、「ハンドル」の意味で「参照」を使用しない傾向があります ( Deitel ∉ "we"は明らかです)。

推奨読書:

他の C++ の本には十分注意してください!! 人生の大部分の分野では、上記の 2 つの特定のリストに含まれることが、本が「良い」と見なされるための決定的な前提条件であると提案するのは正気ではありませんが、危険なほど正しくない C++ テキストが十分に豊富にあります。そこ (あなたが引用したテキストなど) と、これは私たちの言語の初心者にとって十分に大きな問題であり、C++ の本の世界では実際に従うべき良い経験則です。

于 2013-01-14T04:51:57.943 に答える
8

私のコメントを要約すると、あなたは絶対に正しいです!

この本は専門用語の選択が間違っています。配列がCポインタに減衰することについて話そうとします。これは、このポインタを値渡すことを、間違っている参照で渡すことを指します。

これはよくある誤解です。私もこのように教えられたと思います(ポインタを値として渡す==参照で渡す)。これは、C ++参照と参照渡しに関しては、完全に間違っています。

これが正しければ、私はこれを行うことができないでしょう..

void ModifyMyArray(int *array){
   int oops[4]= {0};
   array = oops;

   array[2] = 1;
}
...
int MyArray[4] = {1,3,5,7};

ModifyMyArray(MyArray);

Javaのこの質問に似ています-Javaは「参照渡し」または「値渡し」ですか?

于 2013-01-14T03:34:39.373 に答える