2016-10-02 2 views
1

私は関数から配列を返すことができないという事実を回避できるように、私の配列を参照渡ししようとしています。私は、私が正しく見た事例に従っていると信じています。しかし、何がうまくいかない?出力が0〜9の数字になると期待していますが、むしろ奇妙なものがあります。Cでの参照で配列を渡す

現在のところ私のプログラムは何を言っているのか分からない。これは現在のところ、参照渡しのみをテストしている計算はしていません。私は計算を試みる前に配列を操作する方法を知っていることを確認したい。

私がやろうとしていること:0-9の数字の配列を作成し、関数に参照渡しして関数内の各要素を出力します。

実際のプログラムでは空の配列が作成され、それを関数に送信すると、関数は素数で配列を埋めます。

#include <stdio.h> 

void primesUpTo(int max,int *resPt); 
void main() 
{ 
    const int MAX = 10; 
    int primes[MAX]; 

    /*TEST*/for(int i = 0; i < MAX;primes[i] = ++i) 

    primesUpTo(MAX,&primes);  
} 

/* Primes up to function 
* Fills array that *resPt points to with primes from 0 to 'max' 
* *resPt: pointer to first element of result array 
* max: int, highest prime number in result array 
* 
* *resPt must be passed as reference 
*/ 
void primesUpTo(int max, int *resPt) 
{ 
    /*TEST*/for(int i = 0; i < max; i++) 
     printf("\nTEST: %d",*(resPt + i)); 
} 

マイコンパイルエラーと、出力:

[email protected]:~/C_Programs/CIS/hw_2/ex_3$ gcc -o test printPrimes.c 
printPrimes.c: In function ‘main’: 
printPrimes.c:11:17: warning: passing argument 2 of ‘primesUpTo’ from incompatible pointer type [-Wincompatible-pointer-types] 
    primesUpTo(MAX,&primes); 
       ^
printPrimes.c:3:6: note: expected ‘int *’ but argument is of type ‘int (*)[(sizetype)MAX]’ 
void primesUpTo(int max,int *resPt); 
    ^
[email protected]:~/C_Programs/CIS/hw_2/ex_3$ ./test 

TEST: 1835627636 
TEST: 1600061541 
TEST: 1869833334 
TEST: 1952802655 
TEST: 0 
TEST: 0 
TEST: 0 
TEST: 0 
TEST: 1 
TEST: 0 
TEST: 1835627636 
TEST: 1 
TEST: 1869833334 
TEST: 1952802655 
TEST: 0 
TEST: 0 
TEST: 0 
TEST: 0 
TEST: 1 
TEST: 0 
TEST: 1835627636 
TEST: 1 
TEST: 2 
TEST: 1952802655 
TEST: 0 
TEST: 0 
TEST: 0 
TEST: 0 
TEST: 1 
TEST: 0 
TEST: 1835627636 
TEST: 1 
TEST: 2 
TEST: 3 
TEST: 0 
TEST: 0 
TEST: 0 
TEST: 0 
TEST: 1 
TEST: 0 
TEST: 1835627636 
TEST: 1 
TEST: 2 
TEST: 3 
TEST: 4 
TEST: 0 
TEST: 0 
TEST: 0 
TEST: 1 
TEST: 0 
TEST: 1835627636 
TEST: 1 
TEST: 2 
TEST: 3 
TEST: 4 
TEST: 5 
TEST: 0 
TEST: 0 
TEST: 1 
TEST: 0 
TEST: 1835627636 
TEST: 1 
TEST: 2 
TEST: 3 
TEST: 4 
TEST: 5 
TEST: 6 
TEST: 0 
TEST: 1 
TEST: 0 
TEST: 1835627636 
TEST: 1 
TEST: 2 
TEST: 3 
TEST: 4 
TEST: 5 
TEST: 6 
TEST: 7 
TEST: 1 
TEST: 0 
TEST: 1835627636 
TEST: 1 
TEST: 2 
TEST: 3 
TEST: 4 
TEST: 5 
TEST: 6 
TEST: 7 
TEST: 8 
TEST: 0 
TEST: 1835627636 
TEST: 1 
TEST: 2 
TEST: 3 
TEST: 4 
TEST: 5 
TEST: 6 
TEST: 7 
TEST: 8 
TEST: 9 
+0

読むポインタへの変換配列について。 – haccks

+0

&primesを渡さず、代わりに単なる "素数"を渡します。 – TheGreatContini

+0

';'が必要です。 'for(int i = 0; i Franck

答えて

3

アレイは常に配列の名前がそれの最初の要素へのポインタであるC.参照により渡されます。だから、あなたはちょうどこの操作を行います。 -

void function (int arr[]){ 
// Some Code..... 
} 
int main(){ 
// Some Code... 
int name[5]; 
function(name); 
// Some Code... 
} 

そして、それは、あなたは、配列の要素の値を変更することができ、変更が呼び出し元の関数に反映されるだろう、働くだろう。

編集: forループの後にセミコロンを追加する必要があることはご存じでしょうか?それ以外の場合は、次の1行も繰り返し処理されます。参照してください -

Corrected CodeOutput

+0

通常のように配列にアクセスできますか? ex:name [1] = 5 ;?私はあなたの答えに応じて私のプログラムを変更しましたが、私はまだ奇妙な出力を持って、それは上に投稿された出力のように多く見えます。 – user2809114

+1

Cは値渡しのみを持ち、配列や他の引数は参照渡しされません。実際、配列は一度も渡されません*。関数の引数が配列に評価されると、それは最初の要素へのポインタに変換され、**ポインタ**は(値によって)渡されます。ポインタを値で渡すことは、参照渡しと同様のセマンティクスを持ちますが、同一ではありません。 –

+0

@JohnBollinger「参照渡し」という用語のプログラミングでは、関数が変更を行い、呼び出し元がその変更を参照できるように渡すことを意味します。したがって、このメソッドは配列を参照渡しします(値渡しのポインタも渡します)。 –

関連する問題