繁体   English   中英

在 C 中将数组作为参数传递时出现意外结果?

[英]Unexpected results while passing arrays as parameters in C?

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

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

in main:
f(validArray);

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

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

in main:
f(validArray);

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

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

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

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

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

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

然后这将改变validArray[4]

b[2]=1;

本质上是

*(b+2) = 1;

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


b=b+2;

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

首先,数组是不可修改的左值。 所以你可能不会写例如

validArray = validArray + 2;

至于这个伪代码片段

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 中,术语“通过引用传递”意味着通过指向对象的指针间接传递对象。 因此,在函数中取消引用指针可以更改指向的对象。 指针是相同的对象。 因此,如果要更改原始指针,则必须将指针传递给该指针。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM