0

だからここにコードがあります-私はそれで何か単純なことが間違っていることを知っていますが、私はそれを理解できないようです。私はさまざまな数値タイプ、ポインター、およびその他のishを試しました....変数は関数内で正しい値bを持っています-しかし、それらが渡されると、and (または同様のもの) として出力されます...cseparate()main()b = 0c = -471211

私は何が欠けていますか?コードは次のとおりです。

    #include <stdio.h>
    void separate(int a, int b, int c){
      b = a/12;
      c = a%12;   }


   int main(){
     int a = 100
     int b, c;
     separate(a, b, c);
     printf("%i = 12 * %i + %i \n", a, b, c);
4

4 に答える 4

5

Cでは、すべての関数の引数は値で渡されます。そのため、引数を変更しても、関数の外部では何の効果もありません。関数の引数を変更する場合は、関数へのポインターを渡す必要があります。

void change_arg(int *arg)
{
    *arg = 42;
}

int arg = 1337;
printf("Before: %d\n", arg);
change_arg(&arg);
printf("Afer: %d\n", arg);
于 2013-03-06T20:59:03.607 に答える
3

b初期化されてcいません。コピーで呼び出すため、関数には設定されません。必要な値を返すかint*、引数に使用します。

Cの仕組みについてもう少し読む必要があると思います。

于 2013-03-06T20:57:39.533 に答える
0

上記の関数では、変数を値で渡しているため、 と の値はbc呼び出し後に変更されませんseparate()。これらは初期化されていないため、ランダムな値です。

代わりにこれを試してください:

#include <stdio.h>

void separate(int a, int* b, int* c){
    *b = a/12;
    *c = a%12;
}

int main(){
    int a = 100;
    int b, c;
    separate(a, &b, &c);
    printf("%i = 12 * %i + %i \n", a, b, c);
}

これにより、関数のポインタbのアドレスとアドレスが渡されます。c次に、関数はアドレスの値を変更します。

于 2013-03-06T21:03:10.340 に答える
0

関数を次のように書き換えます

void separate(int a, int* pb, int* pc){
  *b = a/12;
  *c = a%12;   }

ここで、パラメータbcは int へのポインタです。

次に、メインで次のようなものを書きます

 int a = 100
 int b, c;            
 int *pb, *pc;

 pb=&b;
 pc=&c;

ここで、変数pbpcは int へのポインターです。命令pb=&b;とを使用して、 のメモリ ロケーションと のメモリ ロケーションを割り当てpc=&c;ます。pbbpcc

今電話したら

 separate(a, pb, pc);
 printf("%i = 12 * %i + %i \n", a, b, c);

適切な出力が得られます。

于 2013-03-06T21:04:53.800 に答える