0

所以这是代码 - 我知道它有一些简单的问题,但我似乎无法弄清楚。我尝试了不同的数字类型、指针和其他 ish....变量bc在函数中具有正确的值separate()- 但是当它们被传递给main()它们时,它们会以b = 0and c = -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

重写函数如下

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;您将分配给pb的内存位置bpc的内存位置c

现在如果你打电话

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

你得到正确的输出。

于 2013-03-06T21:04:53.800 回答
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 回答