C または C# で配列が引数として関数に渡される場合、関数は引数に対して動作しますか? ポインターのように?
5 に答える
この回答は C のみです
はい、それは絶対にできます。関数は配列をポインタとして扱います
例えば:
#include <stdio.h>
#define SIZE 10
void anyfunction(int array[]){
int i=0;
for(i=0;i<SIZE;i++){
array[i] = i;
}
}
int main(){
int i=0;
int numbers[SIZE] = {0};
anyfunction(numbers);
for(i=0;i<SIZE;i++){
printf("%d ",numbers[i]);
}
printf("\n");
return 0;
}
出力:
Notra:Desktop Sukhvir$ ./test
0 1 2 3 4 5 6 7 8 9
はい、できますが、配列はポインターに崩壊します。
式に現れる array-of-T 型の左辺値 [質問 2.5を参照] は、(3 つの例外を除いて) 最初の要素へのポインターに崩壊します。配列は「変更可能な左辺値」ではないため、結果のポインターの型は T へのポインターです。
(例外は、配列が sizeof または & 演算子のオペランドであるか、文字配列のリテラル文字列初期化子である場合です。)
配列型の式は、すべてではありませんがほとんどのコンテキストで、単項演算子&
またはsizeof
演算子のオペランドでない限り、配列オブジェクトの最初の要素へのポインターに暗黙的に変換 (「減衰」) されます。
推奨される読書: CFAQ-Arrays and Pointers。
C のコンテキストでは、配列名はベース アドレスを指します。
4番目a[10]
のオブジェクトを参照するとします。つまりa[3]
、これは同等のメソッド*(a+3)
です。
したがって、配列をポインターとして使用する方法がわかります。
配列名を引数として関数に渡すと、実際には配列のベース アドレスが渡されます。
そのとおり。その配列を配列ビヘイビアーとして関数で使用できます。