C++ 我可以用同样的方法使用char*c和字符串吗?

C++ 我可以用同样的方法使用char*c和字符串吗?,c++,pointers,c-strings,C++,Pointers,C Strings,char*c和char*c之间有什么区别?这个代码有什么问题 #include<iostream> #define num 2 using namespace std; int main (){ char *c="HelloWorld!!!"; cout<<*(c+num); return 0; } 在C++中,字符串文本是由const char实现的。 此外,编译器不会区分 char* c; 及 由于指向char的指针具有相同的含义,char

char*c和char*c之间有什么区别?这个代码有什么问题

#include<iostream>
#define num 2
using namespace std;
int main (){
    char *c="HelloWorld!!!";
    cout<<*(c+num);
    return 0;
}

在C++中,字符串文本是由const char实现的。 此外,编译器不会区分

char* c;


由于指向char的指针具有相同的含义,char*c和char*c之间绝对没有区别。代码的问题在于HelloWorld是一个常量char*,因此您必须将其强制转换为char*,或者将其存储在常量char变量中。此外,我不会定义那个宏,只要将那个数字存储在variableconstexpr变量中就行了。如果您想要编译时求值,它更容易读取

#include<iostream>
using namespace std;
int main() {
    constexpr int num = 2;
    char* c = (char*)"HelloWorld!!!";
    const char* c2 = "HelloWorld!!!";
    cout << *(c + num);
    return 0;
}

如果在启用-Wall标志的情况下编译程序,将看到以下错误消息:

warning: ISO C++11 does not allow conversion from string literal
      to 'char *' [-Wwritable-strings]
    char *c="HelloWorld!!!";
您应该将c变量设置为const char*,以使警告消失,因为字符串文字是以这种类型实现的,而c中char*就足够了

注: 您可以简单地使用auto关键字,让编译器找到正确的类型:

auto c = "HelloWorld!!!"

char*和char*之间没有区别,但是char&和char*之间有区别,所以请编辑您的问题,更具体地说,说出您期望发生什么,因为您的代码正在执行您编写的操作,所以我不知道是否希望将char数组与2连接起来。如果是这种情况,那么我建议您使用,在这个库中,您可以使用运算符+进行连接

您在代码中所做的是:创建数组,然后在地址c+2上打印一些内容。那是“l”。当我跑的时候,我得到了这个。正如之前有人说过的,您必须小心,因为const char*不能用于初始化char*

如果确实要更改该字符串,可以执行以下操作:

 #include<iostream>
 #include <stdlib.h>

 #define num 2

using namespace std;
int main() {
    const char* c = "HelloWorld!!!";
    char* str;
    int n = 0;
    while (true)
    {
        if (c[n++] == '\0') // '\0' is character for terminating string
        {
            break;
        }

    }
    str = (char*)calloc(n + 1, sizeof(char));
    for (int i = 0; i <= n; i++)
    {
        if (i < n - 1)
        {
            str[i] = c[i];
        }
        else
        {
            if (i == n - 1)
            {
                str[i] = (char)('0' + num);// with this sum you wil get ascii code of '2' and write it in str + n - 1
            }
            else
            {
                str[i] = '\0';
            }
        }
    }
    cout << str;

    //cout << *(c + num);
    return 0;
}

字符串和字符*之间存在差异。在C/C++中,只能有字符数组。可以像对int一样对char执行任何基元操作。但若不调用自己的函数,则不能直接对数组执行操作。因此,您应该使用库来执行诸如连接、比较字符串或其他操作。如果您更喜欢直接使用char*,则应该使用,但如果您想更舒适,则可以使用并创建字符串作为对象。

您的编译器应该要求您在声明c时添加一个常量。您的意思是什么&char*c?这段代码中有什么错误?除了缺少常量之外,代码没有任何问题。它输出l,这是HelloWorld中的第三个字母!!!i、 e.c+2处的字符。你期望得到什么?如果你想从第三个字母一直打印到最后,你应该删除c+num前面的*号。正如答案所指出的,char*c和char*c之间没有区别,但即使如此,还是要坚持前者!*属于变量,而不是类型。例如,如果有char*c,d,e,那么只有c是char*。。。。d和e仅为字符。;在int num=2中缺少。从技术上讲是HelloWorld!!!是常量字符[14],不是常量字符*,尽管它可以隐式转换为常量字符*。我建议使用constexpr int num=2,如果故意将define放置为表示编译时计算的constant.num应位于constexpr变量中。
 #include<iostream>
 #include <stdlib.h>

 #define num 2

using namespace std;
int main() {
    const char* c = "HelloWorld!!!";
    char* str;
    int n = 0;
    while (true)
    {
        if (c[n++] == '\0') // '\0' is character for terminating string
        {
            break;
        }

    }
    str = (char*)calloc(n + 1, sizeof(char));
    for (int i = 0; i <= n; i++)
    {
        if (i < n - 1)
        {
            str[i] = c[i];
        }
        else
        {
            if (i == n - 1)
            {
                str[i] = (char)('0' + num);// with this sum you wil get ascii code of '2' and write it in str + n - 1
            }
            else
            {
                str[i] = '\0';
            }
        }
    }
    cout << str;

    //cout << *(c + num);
    return 0;
}