字符串复制功能:简单的问题
StringCopy function: simple issue
我有这个函数可以获取两个指向字符串的指针。
void copy(char *s, char *t){ /*copy the string pointed by t into string pointed by s*/
while( (*s = *t) != '[=10=]'){
s++;
t++;
}
return;
}
问题是:我看到它在 s++
和 t++
(即 "pointers, go to next character and check it")以及 *s++
和 *t++
下都有效。所以我问这不应该 *s++
修改指针指向的字符吗?为什么效果一样?
使用一些示例字符串在 ubuntu 中编译。
提前致谢
有两部分。
首先:
both with s++ and t++ (that means "pointers, go to next character and check it") and with *s++ and *t++.
嗯,你看到的结果是一样的,不代表他们是一样的。
如果片段像
s++;
t++;
和
*s++;
*t++;
它们产生相同的行为,就像在这两种情况下一样,只有 post 增量的副作用很重要(因为它们是 持久性 ,影响实际变量),而不是生成的结果(应用取消引用运算符的结果被丢弃)。
实际上,如果你尝试编译第二个版本(*s++;
thingy),你会收到类似
的警告
Warning: value computed is not used [-Wunused-value]
然后,其次:
shouldn't *s++
be modifying the character pointed by the pointer
不,请阅读 operator precedence。 post 增量绑定高于解引用运算符,副作用在结果计算值后开始,即解引用操作。
对于初学者来说,最好用限定符 const
声明第二个参数。
void copy(char *s, const char *t);
函数保证复制的源字符串不被更改,是函数与函数使用者之间的契约。
如果像这样声明函数会更好
char * copy(char *s, const char *t);
当函数 returns 指向结果字符串的第一个字符时。
至于原题那么如果你把函数写成
void copy(char *s, char *t){ /*copy the string pointed by t into string pointed by s*/
while( (*s = *t) != '[=12=]'){
*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++) != '[=13=]');
// return;
}
我有这个函数可以获取两个指向字符串的指针。
void copy(char *s, char *t){ /*copy the string pointed by t into string pointed by s*/
while( (*s = *t) != '[=10=]'){
s++;
t++;
}
return;
}
问题是:我看到它在 s++
和 t++
(即 "pointers, go to next character and check it")以及 *s++
和 *t++
下都有效。所以我问这不应该 *s++
修改指针指向的字符吗?为什么效果一样?
使用一些示例字符串在 ubuntu 中编译。 提前致谢
有两部分。
首先:
both with s++ and t++ (that means "pointers, go to next character and check it") and with *s++ and *t++.
嗯,你看到的结果是一样的,不代表他们是一样的。
如果片段像
s++;
t++;
和
*s++;
*t++;
它们产生相同的行为,就像在这两种情况下一样,只有 post 增量的副作用很重要(因为它们是 持久性 ,影响实际变量),而不是生成的结果(应用取消引用运算符的结果被丢弃)。
实际上,如果你尝试编译第二个版本(*s++;
thingy),你会收到类似
Warning: value computed is not used [-Wunused-value]
然后,其次:
shouldn't
*s++
be modifying the character pointed by the pointer
不,请阅读 operator precedence。 post 增量绑定高于解引用运算符,副作用在结果计算值后开始,即解引用操作。
对于初学者来说,最好用限定符 const
声明第二个参数。
void copy(char *s, const char *t);
函数保证复制的源字符串不被更改,是函数与函数使用者之间的契约。
如果像这样声明函数会更好
char * copy(char *s, const char *t);
当函数 returns 指向结果字符串的第一个字符时。
至于原题那么如果你把函数写成
void copy(char *s, char *t){ /*copy the string pointed by t into string pointed by s*/
while( (*s = *t) != '[=12=]'){
*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++) != '[=13=]');
// return;
}