[英]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
向前移动,但b
是foo
本地的,并且在不更改数组的情况下消失了。 例如,如果你这样做了。
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.