リンク:https://zhuanlan.zhihu.com/p/23726515
出典:
著者がほぼ著作権を所有していることを知ってい ます。商用の再版については、著者に連絡して許可を得てください。非商用の再版については、出典を示してください。
ステートメント:
-
記事の内容は「C ++ Primer Chinese Edition(5th Edition)」から収集・編集されたものであり、著作権は原本に帰属します。
-
オリジナルの本はより詳細で素晴らしい解釈を持っています、学習のために本物の本を購入してください。
-
この記事は学習とコミュニケーションのみを目的としており、いかなる形式の転載も禁止されています
正式なパラメータ初期化のメカニズムは、変数の初期化と同じです。
値渡しと参照渡し
-
仮パラメータが参照型の場合、対応する実パラメータにバインドされます
-
それ以外の場合は、実際のパラメーターの値をコピーして、仮パラメーターに割り当てます。
ポインタも上記のルールに従います。関数を呼び出すと、ポインタパラメータの値がコピーされてポインタパラメータに割り当てられます。これらは2つのポインタですが、同じオブジェクトを指します。
参照渡しはオブジェクトのコピーを回避できるため、可能な限り参照渡しを使用することをお勧めします。
参照パラメーターの値を変更する必要がない場合は、通常の参照よりも多くの引数タイプを受け入れることができる定数参照を使用するのが最善です。
-
通常の参照は、初期値と同じタイプのオブジェクトのみを受け入れます
-
定数参照は、同じタイプ、式、およびリテラルのオブジェクトで初期化できます
関数が複数の戻り値を必要とする場合は、参照パラメーターを使用して追加情報を返すことができます
constパラメーターと実際のパラメーター
void fcn( const int i);
void fcn( int i );
他の初期化手順と同様に、仮パラメータの最上位のconstは無視されるため、関数のオーバーロードにはなりません。つまり、実際のパラメータは一定でも非一定でもかまいません。
配列パラメーター
配列には2つの特別なプロパティがあります
-
コピーをサポートしていません
-
配列名は通常、自動的にポインタに変換されます
また、配列パラメータを特別にします
void print( const int* );
void print( const int[] );
void print( const int[10] );
主観的には、これら3つは異なる定義であると思いますが、後の2つも自動的にconst int *に変換されて処理されます。
呼び出しでは、実際のパラメーターは配列名または整数ポインターにすることができます
仮パラメーターは整数ポインターのみであるため、配列の次元は関数に渡されません。この問題を解決するには3つの方法があります
-
最初の要素と最後の要素のポインタを渡します
-
配列のサイズを渡すためのパラメーターを追加します
-
配列参照パラメーターを使用する
配列参照パラメーター
void print(int (&arr)[10] );
ただし、この定義では、次元10の配列のみを渡すように制限されています。
多次元配列
前述のように、多次元配列は実際には配列の配列であり、最初の要素は配列へのポインターです。
void print(int matrix[10][10], int rowSize);
なぜrowSizeを渡すのですか?
配列は自動的にポインタに変換されることがわかっていますが、これも例外ではありません。上記の定義の本質は次のとおりです。
void print(int (*matrix)[10], int rowSize);
したがって、2次元配列の最初の次元を指定するにはrowSizeが必要です。
main関数の仮パラメータ
main関数は、配列パラメーターに精通していることの最良の例です。
int main(int argc, char *argv[]) {}
2番目のパラメーターはchar *の配列として宣言されています。これは、複数の文字列を渡すことができ、特定の数値がargcで指定されることを意味します。
次のように定義することもできます
int main( int argc, char **argv ) {}