* s和s [i]在这个函数中有什么区别?

时间:2014-05-03 11:27:05

标签: c arrays pointers

我正在阅读" C编程语言" (Kernighan& Ritchie)和关于指针的章节,它提供了两份“strcpy'功能。一个用于数组,另一个用于指针。我相信这两个版本用于说明数组和指针之间的区别,但我无法看到。

阵列版本是:

void strcpy(char *s, char *t) {
    int i = 0;
    while ((s[i] = t[i]) != '\0') {
        i++;
    }
}

指针版本为:

void strcpy(char *s, char *t) {
    while ((*s = *t) != '\0') {
        s++;
        t++;
    }
}

然而,该书还指出......在评估a [i]时,C立即将其转换为*(a + i)'。在这种情况下,这两个函数肯定会做同样的事情吗?

N.B我知道有更优雅的方式来编写这段代码,我刚刚从书中复制了它。

4 个答案:

答案 0 :(得分:5)

  

我相信这两个版本用于说明数组和指针之间的区别。

不,不是真的。这两个版本用于演示可以使用a[i]语法或直接指针算法实现数组索引。

正如您正确指出的那样,这两个版本执行完全相同的操作。毕竟,它们都是strcpy的实现。关键在于作者试图展示不同的方法来实现相同的最终结果。

答案 1 :(得分:3)

  

在这种情况下,这两个函数肯定会做同样的事情吗?

完全。

一个版本保持指针不变,并在每次访问时添加一个偏移i,它会不断增加。

另一个版本修改指针变量,以便直接指向我想要的位置。

答案 2 :(得分:0)

*ss[0]的替代语法。看看这个版本:

void my_strcpy(char *s, char *t)
{
    int i = 0;
    while ((s[i] = t[i]) != '\0')
    {
        if ( rand() % 2 )
             ++i;
        else
             ++s, ++t;
    }
}

这是为了说明两个例子之间的区别在于,一个增加索引,一个增加基数;但这两个都达到了同样的目的。是否使用a[b]*(a+b)形式的语法没有区别,根据定义它们是相同的。考虑s[i]*(s+i)是同一事物的替代语法也可能有所帮助。递增s与递增i具有相同的效果。

答案 3 :(得分:0)

在阵列版本中,要访问阵列,您使用s [i]并通过递增索引i,您可以访问字符串中的字符。 在指针方法的情况下,你没有使用索引变量,并且通过递增指针,即s和t,你正在访问字符串中的字符。这就是上述程序中的差异。这里是 * s表示*(s + 0)等效于s [0]和 s [i]在内部表示*(s + i)。