首页 > 解决方案 > 传递 C 字符串并将其与本地指针一起使用

问题描述

查看来自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;

这看起来很可能,但看起来不平衡,因为右侧缺少星号。我试过了,它似乎可以工作,但我想知道它是否正确,并担心我以后会遇到一些难以追踪的运行时错误,更进一步。

但是,下面这行显然是错误的(因为它会将指针更改为指向p由 C 字符串的第一个字符的值给出的位置str):

    const char *p = *str;

标签: cstringpointersinitializationvariable-assignment

解决方案


这是混淆。原始代码非常清晰,无需更改任何内容。您的更改使其可读性降低。

可以做些什么来稍微增加可读性,这是一个外观上的改变,就是使用 for 循环来代替:

void PrintString (const char *str) 
{
    for(const char* p=str; *p != '\0'; p++)
    {
        Serial.print(*p);
    }
}

或者:

void PrintString (const char *str) 
{
    for(size_t i=0; str[i] != '\0'; i++)
    {
        Serial.print(str[i]);
    }
}

推荐阅读