【发布时间】:2019-03-20 21:11:13
【问题描述】:
从The Evils of Arduino Strings看这段代码
void PrintString(const char *str) {
const char *p;
p = str;
while (*p) {
Serial.print(*p);
p++;
}
}
我正在考虑减少/压缩它。首先,这似乎是等价的:
void PrintString(const char *str) {
const char *p;
p = str;
while (*p)
Serial.print(*p++);
}
现在,看前两行,我如何将以下两行结合起来,可以吗?
const char *p;
p = str;
我可以这样做吗?
const char *p = str;
这看起来很可能,但看起来不平衡,因为右侧缺少星号。我试过了,它似乎可以工作,但我想知道它是否正确,并担心我以后会出现一些 hard-to-track-down 运行时错误,进一步向下行。
但是,下面这行显然是错误的(因为它会将指针 p 更改为指向 C 字符串的第一个字符 str 的值给出的位置):
const char *p = *str;
【问题讨论】:
-
p和str具有相同的类型。如果类型拼写为“pointer_to_const_char”而不是“const char *”,您是否会有同样的疑问? -
如果你想要紧凑:
while (*str) Serial.print(*str++);. -
@Mayur 不,实际上你是对的——我认为这是一个接一个地打印字符串,但那将是一个 ** 输入。 (毕竟看起来Serial.Print 可以从文档中一次性打印一个字符串。)这是一个字符一个字符的打印,所以你的初始版本很好。
-
const char *p = str;...*看起来不平衡*。您追求的不是平衡的外观,而是类型的正确性。p是char *。str也是如此。所以没关系。 -
@Greenonline 是的,你不需要局部变量——它可以是整个身体。 (但为了便于阅读,我会将其分成两行。)
标签: c string pointers initialization variable-assignment