带/ pointer参数的函数是否仍具有这些参数的本地副本?

时间:2014-08-29 23:36:18

标签: c

考虑以下来自K& R的代码:

/* strlen: return length of string s */

int strlen(char *s)
{
    int n;

    for (n = 0; *s != '\0', s++)
        n++;
    return n;
}

K& R声明这里“s ++对调用strlen的函数中的字符串没有影响,但只是增加了strlen指针的私有副本”。

  1. 我将“s ++”解释为等同于“& s [0] +1”是正确的。这对我来说似乎不太敏感,所以我在这里一定是错的。
  2. 如果s ++ 真的对* s没有影响,那么循环条件(即* s!='\ 0')如何才能改变真值?毕竟,* s是不受影响由s ++。因此,它首先要么是永远的,要么是假的。为什么不是这样?

2 个答案:

答案 0 :(得分:2)

  

我是否正确地将“s ++”解释为等同于“& s [0] +1”。

没有。表达式&s[0]+1没有副作用 - s++。它在这里使用的方式(即没有使用其返回值),s++相当于s = s + 1s = &s[0]+1s = &s[1](它们都做同样的事情)。

  

如果s ++对* s没有影响,那么循环条件(即* s!='\ 0')如何才能改变真值?

s++确实会对*s产生影响,因为它会改变s指向的内容,如果s指向其他位置,那么当然是表达式*s将会改变。但是它对s之前指出的值没有影响。

为了说明这一点,请考虑在字符strlen上调用str char* str = "abcd";:在循环开始时s指向str[0],因此{ {1}}等于'a',因为*s等于str[0]。完成'a'后,s++现在指向s。现在str[1]等于*s,因为'b'等于str[1],但'b'str[0]的内容均未发生变化。

答案 1 :(得分:1)

指针的副本,是的。始终复制参数。同样,函数可以将参数修改为自己的局部变量,而不会影响原始变量,使用指针也可以这样做。

通过递增s++,您与s = &s[1]s = s + 1进行相同操作,并将s修改为本地变量,此更改不会传播到*s调用者中的原始指针。

只有修改指针指向的值,就像修改char** var时一样,它会在调用者中修改它。这就是为什么在尝试修改指针本身时,你必须使用指向指针的指针,例如:{{1}}