传递 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字符的指针)
  • pstr 是变量,都是指针(指向 const char

你可以使用一些非常规的布局来编写上面的代码:

const char *  /* Note the lack of a semicolon */
p = str;

以上代码以 p 被定义为指向 char 的指针并携带 str.

的值结束

你得到相同的 "result" 下面的代码

const char *p;
p = str;

注意,前者称为"initialisation",而后者称为"assignment"。