我有这个函数可以得到两个指向字符串的指针。
void copy(char *s, char *t){ /*copy the string pointed by t into string pointed by s*/
while( (*s = *t) != '\0'){
s++;
t++;
}
return;
}
问题是:我看到它有效,包括s++
和t++
(表示“指针,转到下一个字符并检查它”)以及*s++
和{{ 1}}。所以我问这不应该*t++
修改指针指向的字符?为什么它的工作原理相同?
在ubuntu中编译了一些示例字符串。 提前致谢
答案 0 :(得分:3)
分为两部分。
首先:
使用s ++和t ++(表示“指针,转到下一个字符并检查它”)和* s ++和* t ++。
嗯,你看到的结果是一样的,这并不意味着它们是相同的。
如果是
这样的代码段 s++;
t++;
和
*s++;
*t++;
它们产生相同的行为,因为在两种情况下,只有后增量的副作用(因为它们是持续,影响实际变量),而不是产生的结果(结果)应用解除引用运算符的方法被丢弃。)
实际上,如果您尝试编译第二个版本(*s++;
thingy),您将收到类似
警告:未使用计算的值[-Wunused-value]
然后,其次:
不应
*s++
修改指针指向的字符
不,请阅读operator precedence。 post增量绑定高于解除引用运算符的结果,副作用在结果的值计算之后启动,即取消引用操作。
答案 1 :(得分:0)
对于初学者,最好使用限定符const
声明第二个参数。
void copy(char *s, const char *t);
函数的函数和用户之间的契约是函数保证复制的源字符串不会被更改。
声明像
这样的函数会更好char * copy(char *s, const char *t);
当函数返回指向结果字符串的第一个字符的指针时。
至于原始问题,那么如果你编写像
这样的函数void copy(char *s, char *t){ /*copy the string pointed by t into string pointed by s*/
while( (*s = *t) != '\0'){
*s++;
*t++;
}
// return;
}
然后不使用表达式*s++
和*t++
的值。所以在这种情况下,指针的解引用是冗余操作。
但是,您可以按照以下方式编写函数,其中取消引用是有意义的
void copy(char *s, char *t){ /*copy the string pointed by t into string pointed by s*/
while( ( *s++ = *t++) != '\0');
// return;
}