【发布时间】:2014-05-03 11:27:05
【问题描述】:
我正在阅读“The C Programming Language”(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 我知道有更优雅的方式来编写这段代码,我只是按照书中的原样复制了它。
【问题讨论】:
-
我想说,这些函数更能说明数组和指针的等价性,因为它们解决了同样的问题。
-
“显示这两个版本是为了说明数组和指针之间的区别” - 并非如此。它们只是向您展示如何使用数组语法和简单的指针语法来做到这一点。
-
虽然数组和指针是不等价的。 “array-pointer equivalence”是一个用词不当,会引起很多人的注意,而这一切都只是基于
s为您提供一个与@987654324 值相等的右值@,在右值上下文中。 -
@MattMcNabb 它也适用于左值上下文,
*s = X等效于s[0] = X,即使对于数组s。 -
作为
*的操作数正在请求s上的左值到右值转换,这就是我的意思