![](http://oshiete.xgoo.jp/images/v2/pc/qa/question_title.png?e8efa67)
関数に変数を受け渡すとき、配列とそれ以外の変数では受け渡すものが違いますよね。
変数の場合は、変数の値を関数側の変数にコピーする。
配列の場合は、配列そのもの(配列のポインタ)を関数に渡す。
なぜ配列の場合は値のコピーではなくて、ポインタを渡す仕様になっているんでしょうか。
ひとつめは、どのような意図でそのような仕様になっているのかという質問です。
もうひとつは、関数に配列の値だけを渡すにはどうすればいいのか、つまり元の配列のほうの値は書き換えないで欲しいというときはどうすればよいのかという質問です。
よろしくおねがいします。
No.4ベストアンサー
- 回答日時:
Cでは「添え字のない配列変数は、配列の実体のポインタを現わす」からです。
これは「関数の引数に限らず、いつも」です。
例えば、
int a[10];
int *p;
p=a; /* p=&a[0]; と同じ効果を得る。但し、異なる構文なので、厳密には異なる */
など。
「aは配列の実体のポインタ」なので「ポインタ変数であるp」に代入出来るのです。
なので、
sub(a);
などのように関数の引数に「a」を使えば「aは配列の実体のポインタ」なので、ポインタが渡されます。
注意しないとならないのは「関数の引数だから、ではない」と言う事。「関数の引数にしたからポインタになった」と考えるのは「大間違い」です。
また「a」と「&a[0]」は「値は同じ」ですが「意味が違う」ので注意しましょう。例えば「a+1」と「(&a[0])+1」は「異なる値」になります。
>もうひとつは、関数に配列の値だけを渡すにはどうすればいいのか
・呼び出し前にコピーを作って、コピーのポインタを渡す。
・呼び出し前にコピーを作って、戻ってきたらコピーを元の配列に書き戻す。
・呼ばれた方でコピーを作って、コピーを書き替える。
・呼ばれた方でコピーを作って、帰る前にコピーを元の配列に書き戻す。
など。
No.3
- 回答日時:
関数に配列全体を渡すのと、配列の先頭アドレスだけを渡すのとでは、処理の重さがぜんぜん違います。
昔はCPUが非力でしたので、配列は先頭アドレスを渡すもの、と決めて、文法もそのようになりました。
それからCPUも強力になって、構造体なんかは全体を渡せるようになりましたが、配列に関しては文法的な問題もあって、昔のままの仕様です。
というわけで、関数に配列の値だけを渡す方法は存在しません。
呼び出し側でコピーするか、呼び出される側でコピーするか、あるいは構造体でラップしてやるかのどれかですね。
No.1
- 回答日時:
2つ目については「受け取った方で適当にコピーしてください」となるでしょうか.
1つ目は, たぶん「配列全部をコピーしてたら (いろいろと) もったいない」からでは.
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# C言語初心者 ポインタについて、お助けください、、 2 2023/03/15 23:50
- C言語・C++・C# 関数ポインタの高速化のメリット 7 2023/05/05 20:15
- Ruby 初心者プログラミング 3 2022/10/12 11:31
- Perl perlで2次元配列をサブルーチンに値渡しで渡す 5 2022/12/17 18:49
- その他(プログラミング・Web制作) python質問 1 2023/08/14 11:54
- C言語・C++・C# C言語プログラム変更 2 2022/12/21 15:03
- Visual Basic(VBA) マクロについて教えてください。 4 2023/06/06 09:06
- Visual Basic(VBA) Excel のユーザー定義関数でソルバーが動作しない 1 2022/09/05 19:51
- C言語・C++・C# c言語 配列とポインタについて 3 2023/02/09 22:53
- その他(プログラミング・Web制作) pythonのプログラムについての質問です。 1 2023/05/26 10:31
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
C言語 配列の長さの上限
-
先頭アドレスとは何ですか?
-
C++ vectorに配列をプッシュしたい
-
メモリの初期値
-
C言語初心者 構造体 課題について
-
【速いブラインドタッチ】手を...
-
テキストファイルから文字列を...
-
Functionの戻り値を2次元配列...
-
配列で格納したものをmsgboxで...
-
9枚の写真がA4 1枚に印刷できま...
-
2次元配列の、黒いマス目で囲...
-
配列を使わずに、変数名を動的...
-
ExcelVBAで質問です。離れた二...
-
C++ 配列を返すには?
-
VB.NET 構造体の配列の検索機能...
-
C# 配列の変数宣言について。
-
LGノートPCグラムについて
-
テンキーの配列について
-
配列の参照渡し
-
COBOLのINITIALIZEにあたるもの
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
C言語 配列の長さの上限
-
配列を使わずに、変数名を動的...
-
先頭アドレスとは何ですか?
-
配列で格納したものをmsgboxで...
-
C# Listを使わずに2次元配列の...
-
C# 配列の変数宣言について。
-
テキストファイルから文字列を...
-
配列の参照渡しで型が一致しま...
-
ExcelVBAで質問です。離れた二...
-
unsigned char配列への入力の仕方
-
VBで構造体の配列を関数に渡す...
-
C++ vectorに配列をプッシュしたい
-
C言語で特定列だけを抽出して配...
-
Excel、VBAのユーザーフォーム...
-
複数の選択範囲の行番号を個別...
-
配列をEraseしてもメモリが開放...
-
配列を含む構造体の初期値について
-
【速いブラインドタッチ】手を...
-
C言語 配列の再初期化
-
Redimした動的配列はEraseする...
おすすめ情報