传递 C 字符串并将其与本地指针一起使用
Passing a C string and using it with a local pointer
查看此代码来自 The Evils of Arduino Strings
void PrintString(const char *str) {
const char *p;
p = str;
while (*p) {
Serial.print(*p);
p++;
}
}
我正在看 reducing/compacting 它。首先,这似乎是等价的:
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;
这是混淆视听。原始代码非常清楚,无需更改任何内容。您的更改会降低其可读性。
您可以做些什么来稍微增加可读性,这是一个外观上的变化,是改用 for 循环:
void PrintString (const char *str)
{
for(const char* p=str; *p != '[=10=]'; p++)
{
Serial.print(*p);
}
}
或者:
void PrintString (const char *str)
{
for(size_t i=0; str[i] != '[=11=]'; i++)
{
Serial.print(str[i]);
}
}
您可以省略 p 指针的使用,直接使用 str 指针参数,因为它是指向常量内容的指针的副本。
对 str 指针所做的更改不会影响调用函数时使用的指针,因为指针是按值传递的。
void PrintString(const char *str) {
while (*str) Serial.print(*str++);
}
如何将 while
替换为 for
。这是我的看法:
void PrintString(const char *str)
{
for(const char* p = str; *p; p++)
Serial.print(*p);
}
我认为这也行得通:
void PrintString(const char *str) {
for(const char* p = str; *p; Serial.print(*(++p)))
;
}
正如其他人所指出的,我们可以用 str
替换 p
,因为 str
是本地副本,就像作为函数参数传递的任何其他变量一样。
void PrintString(const char* str) {
for( ; *str; Serial.print(*(++str)))
;
}
const char *p = str;
This would seem likely but looks unbalanced, in that there is a lack of an asterisk on the right hand side.
如果你正确地分隔了上面片段的元素,它看起来根本不会是“不平衡”:
const char*
是类型(指向const字符的指针)
p
和 str
是变量,都是指针(指向 const char
)
你可以使用一些非常规的布局来编写上面的代码:
const char * /* Note the lack of a semicolon */
p = str;
以上代码以 p
被定义为指向 char
的指针并携带 str
.
的值结束
你得到相同的 "result" 下面的代码
const char *p;
p = str;
注意,前者称为"initialisation",而后者称为"assignment"。
查看此代码来自 The Evils of Arduino Strings
void PrintString(const char *str) {
const char *p;
p = str;
while (*p) {
Serial.print(*p);
p++;
}
}
我正在看 reducing/compacting 它。首先,这似乎是等价的:
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;
这是混淆视听。原始代码非常清楚,无需更改任何内容。您的更改会降低其可读性。
您可以做些什么来稍微增加可读性,这是一个外观上的变化,是改用 for 循环:
void PrintString (const char *str)
{
for(const char* p=str; *p != '[=10=]'; p++)
{
Serial.print(*p);
}
}
或者:
void PrintString (const char *str)
{
for(size_t i=0; str[i] != '[=11=]'; i++)
{
Serial.print(str[i]);
}
}
您可以省略 p 指针的使用,直接使用 str 指针参数,因为它是指向常量内容的指针的副本。
对 str 指针所做的更改不会影响调用函数时使用的指针,因为指针是按值传递的。
void PrintString(const char *str) {
while (*str) Serial.print(*str++);
}
如何将 while
替换为 for
。这是我的看法:
void PrintString(const char *str)
{
for(const char* p = str; *p; p++)
Serial.print(*p);
}
我认为这也行得通:
void PrintString(const char *str) {
for(const char* p = str; *p; Serial.print(*(++p)))
;
}
正如其他人所指出的,我们可以用 str
替换 p
,因为 str
是本地副本,就像作为函数参数传递的任何其他变量一样。
void PrintString(const char* str) {
for( ; *str; Serial.print(*(++str)))
;
}
const char *p = str;
This would seem likely but looks unbalanced, in that there is a lack of an asterisk on the right hand side.
如果你正确地分隔了上面片段的元素,它看起来根本不会是“不平衡”:
const char*
是类型(指向const字符的指针)p
和str
是变量,都是指针(指向const char
)
你可以使用一些非常规的布局来编写上面的代码:
const char * /* Note the lack of a semicolon */
p = str;
以上代码以 p
被定义为指向 char
的指针并携带 str
.
你得到相同的 "result" 下面的代码
const char *p;
p = str;
注意,前者称为"initialisation",而后者称为"assignment"。