【问题标题】:Unexpected results while passing arrays as parameters in C?在 C 中将数组作为参数传递时出现意外结果?
【发布时间】:2020-04-25 00:50:37
【问题描述】:

我正在尝试习惯使用指针,但是在将它们作为参数传递给函数时我有点挣扎。我读到数组是通过引用函数传递的,因此这样的代码可以更改数组元素(假设给出了一个有效的数组):

void f(int *b)
{
  b[2]=1;
}

in main:
f(validArray);

但是,即使我们传递了指针,这似乎也不起作用;

void foo(int *b)
{
  b=b+2;
}

in main:
f(validArray);

不会进一步移动指针。 这是为什么呢?

【问题讨论】:

    标签: c arrays function pointers reference


    【解决方案1】:

    对于初学者来说,数组是不可修改的左值。所以你可能不会写例子

    validArray = validArray + 2;
    

    至于这个伪代码sn-p

    void foo(int *b)
    {
        b=b+2;
    }
    
    in main:
    foo(validArray);
    

    那么指针b是函数的局部变量。所以在函数中b 的值会因为这个语句而改变

        b=b+2;
    

    但这对传递的参数没有影响。

    你可以写

    void foo( int **b )
    {
        *b = *b + 2;
    }
    
    int main( void )
    {
        int validArray[] = { 1, 2, 3, 4, 5 };
    
        int *p = validArray;
        foo( &p );
        printf( "%d\n", *p );
    }
    

    在 C 中,术语“通过引用传递”是指通过指向对象的指针间接传递对象。因此,取消引用函数中的指针,您可以更改指向的对象。指针是相同的对象。所以如果你想改变一个原始指针,你必须将一个指针传递给该指针。

    【讨论】:

    • f( &p );应该是 foo( &p );
    • @Jonaswg 谢谢。这是一个错字。
    【解决方案2】:
    b[2]=1;
    

    本质上是

    *(b+2) = 1;
    

    这意味着它改变了地址(b+2)中的数据


    b=b+2;
    

    这意味着您正在使 b 指向 b 之前指向的元素旁边的 2 元素,这不会影响指针 b 的地址中的数据,因此不会更改数组中的数据validArray

    【讨论】:

      【解决方案3】:

      我读到数组是通过引用函数来传递的

      这不太对。将数组传递给函数时,会传递一个指针。更改指针不会更改数组。但是,您可以通过指针更改数组。这就是b[2]=1; 起作用的原因。 b 仍然只是作为副本传递的指针,因此 b=b+2; 不会更改数组。

      它不会进一步移动指针。这是为什么呢?

      它确实将b 移动到前面,但bfoo 的本地,并且在不更改数组的情况下消失了。例如,如果你这样做了。

      void foo(int *b)
      {
          b=b+2;
          b[2]=1;
      }
      

      那么这将改变validArray[4]

      【讨论】:

      • 哦,因为我使用 [] 取消引用指针 b 我现在确实可以更改数组。
      猜你喜欢
      • 1970-01-01
      • 2011-06-11
      • 1970-01-01
      • 1970-01-01
      • 2012-01-27
      • 1970-01-01
      • 1970-01-01
      • 2017-03-19
      • 2011-12-30
      相关资源
      最近更新 更多