【问题标题】:Basic C pointer question基本 C 指针问题
【发布时间】:2010-07-23 00:17:04
【问题描述】:

自从我上次编写 C 以来已经有一段时间了,我似乎忘记了一切 与此同时...我有一个非常简单的指针问题。假设我有 通过循环迭代计算和的函数。这个功能不仅应该 返回循环计数器以及它计算的总和。因为我只能退回一个 值我假设我能为总和做的最好的事情是声明一个指针。我可以这样做吗:

   int loop_function(int* sum)
   {
    int len = 10; 

    for(j = 0; j < len; j++) 
    {
      sum += j;
    }

   return(j);
   }   

   ....


   int sum = 0;
   loop_function(&sum);
   printf("Sum is: %d", sum);

或者我是否需要定义一个额外的变量来指向我传递给函数的总和?

非常感谢, 马库斯

【问题讨论】:

  • 没有任何迹象表明这与 C++ 远程相关,所以我删除了 C++ 标签。
  • @Nikko 两者都一样。
  • 它会起作用,但在 C++ 中你会使用引用。在某些情况下,您需要这样的指针,但在 sum 永远不会为空、始终使用并且您没有将函数导出到另一种语言的情况下...使用引用。
  • 感谢我们所有的 cmets,它现在工作正常。

标签: c pointers


【解决方案1】:

除了这一行之外,你所拥有的都是正确的:

sum += j;

由于sum 是一个指针,这会将指针中包含的地址增加j,这不是您想要的。您希望将指针指向的增加j,这是通过首先将取消引用运算符*应用于指针来完成的,如下所示:

*sum += j;

此外,您需要在其中的某处定义 j,但我想您知道这一点,这只是一个疏忽。

【讨论】:

    【解决方案2】:

    *sum += j;
    

    你正在做的是增加指针(可能不是你想要的)

    【讨论】:

      【解决方案3】:

      应该是:

      *sum += j;
      

      所以你增加了 指向的值,而不是局部指针变量。

      【讨论】:

        【解决方案4】:

        你不需要创建额外的变量,但你需要在循环中做

         *sum += j

        【讨论】:

          【解决方案5】:

          你必须写 *sum + = j;

          这就够了

          【讨论】:

            【解决方案6】:

            您还可以声明一个简单的结构来保存这两个值,然后传入一个指向该结构实例的指针。这样你就可以操纵这两个变量,并且在函数返回后它们会保留它们的值。

            结构 loop_sum_struct { int loop_ctr; 整数; } 循环总和; loop_function(&loop_sum); 无效循环函数(循环总和结构*s){ 国际长度 = 10; for(s->loop_ctr = 0; s->loop_ctr loop_ctr++) { s->sum += s->loop_ctr; } }

            【讨论】:

              【解决方案7】:

              这个怎么样?

              因为您已经返回 int。因此,另一种方法是将签名更改为

              int loop_function(int sum)

              在打电话时

              int sum = 0;

              ...

              sum = loop_function(sum);

              【讨论】:

              • OP 试图从一个函数返回两件事:循环计数器和总和。在 C 中,这通常意味着传入一个指针并修改它所指向的内容。
              • 啊,真的!我只是在 OP 中查看了定义,它没有将返回值存储在任何地方,但我现在明白你的意思了。谢谢!
              猜你喜欢
              • 2010-11-20
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2010-10-14
              • 1970-01-01
              • 2010-11-15
              • 2011-08-02
              相关资源
              最近更新 更多