2016-09-24 10 views
1

C言語の関数で配列をパラメータとして渡すと、配列のコピーが作成されます。それは実際に元の配列に変更を加えますか?私は数字をバイナリ形式に変換する小さなプログラムをここに持っています。たとえば、数値が15の場合、バイナリ形式は1111になります。C:配列のコピーを作成する関数に渡される配列または元の配列を変更する配列

void convertToBinary(int base10, int result, char *binaryResult){ 
    int binaryVals[8] = {1,2,4,8,16,32,64,128}; 
    if(base10 == 0){ 
     printf("Binary Result %s", binaryResult); 
    } 
    else{ 
     int max = 0; 
     for(int i = 0; i < 8; i++){ 
      if(binaryVals[i] <= base10){ 
       binaryResult[i] = '0'; 
      } 
      else{ 
       max = binaryVals[i-1]; 
       binaryResult[i-1] = '1'; 
       result = base10-max; 
       printf("Result %d", result); 
       break; 
       //convertToBinary(result,0, binaryResult); 
      } 
     } 
    } 
} 
int main(void){ 
    char binaryResult[8]; 
    convertToBinary(15,0,binaryResult); 
} 

再帰部分が失敗しています。なぜ私は分からない。私はそれが再帰を実行するたびに配列のコピーを作成しているからだと思う。しかし、私はどのようにそれを修正するか分からない。

+0

これは役に立ちますか? http://stackoverflow.com/a/1106977/4511978 –

+0

http://www.c-faq.com/aryptr/aryptrequiv.html – jamesdlin

+0

配列にパラメータを渡すと、配列のコピーが作成されていますしかし、私は元の配列をどのように変更できるかをまだ完全に理解していません。私はまだmallocのものとそれをどのように適用するのか混乱しています。 –

答えて

2

関数に渡された配列は、常に元の配列を変更します。関数宣言:あなたは配列引数でこれらの関数を呼び出すときに、配列は、両方のためのポインタにを減衰するため

void func(int* array); 
void func(int array[]); 

は、等価です。ポインタを渡すので、実際には配列を参照渡ししており、元の配列は変更されています。

+0

Nit:配列は2番目のケースのポインタにのみ崩壊します。最初のケースでは、配列はまったくありません。しかし、主なポイントはまだ立っています。 – ravron

+3

@ravron:どちらの宣言も同等です。 2番目の宣言を最初の宣言に等しくするプロセスは、正式には「配列型の崩壊」と呼ばれません。 "Array type decay"は*式*の中の* objects *の配列に起こります。上記は宣言であり、式ではありません。 – AnT

+1

厳密に言えば、関数に配列を渡すのではなく、最初の要素**へのポインタです。これが 'sizeof(array)'が 'int'へのポインタのサイズをもたらす理由です。両方のテキストバリアント。意味的にはそれらは同等ではなく、同一である。 – Olaf

関連する問題