我正在阅读" 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我知道有更优雅的方式来编写这段代码,我刚刚从书中复制了它。
答案 0 :(得分:5)
我相信这两个版本用于说明数组和指针之间的区别。
不,不是真的。这两个版本用于演示可以使用a[i]
语法或直接指针算法实现数组索引。
正如您正确指出的那样,这两个版本执行完全相同的操作。毕竟,它们都是strcpy
的实现。关键在于作者试图展示不同的方法来实现相同的最终结果。
答案 1 :(得分:3)
在这种情况下,这两个函数肯定会做同样的事情吗?
完全。
一个版本保持指针不变,并在每次访问时添加一个偏移i
,它会不断增加。
另一个版本修改指针变量,以便直接指向我想要的位置。
答案 2 :(得分:0)
*s
是s[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)。