将C ++数组分配给指针

时间:2020-07-14 14:10:13

标签: c++ arrays pointers

在此代码中,我们制作了一个const char指针ID,因为它是一个char,所以它只能存储一个元素地址。但是在默认构造函数中,我们为该ID分配了“ NULL”,那么该ID如何保留4个字符? 在参数化构造函数中,我们传递i []数组并将值分配给id,同样,char id如何保存完整的数组? 为什么我们需要const char?

class Employee
{
    public:
        string name;
        const char *id;
        int age;
        long salary;

        Employee ()
        {
            name = "NULL";
            id = "NULL";
            age =0;
            salary = 0;
        };

        // Employee(string n, char id[], int a, long s): name(n), id(id), age(a), salary(s)
        // {};
        Employee (string n,const char i[], int a, long s)    //const use krne k baighar warning a rhe
        {
            name = n;
            id = i;
            age = a;
            salary = s;
        };
        void getData()
        {
            cout<< "Employee ID: "<< id <<endl;
            cout<< "Employee Name: "<< name <<endl;
            cout<< "Employee Age: "<< age <<endl;
            cout<< "Employee Salary: "<< salary <<endl;
        };

};

我很困惑,如果id是char,那么它如何保存5个字符的字符串文字。 CHAR类型只能存储单个字符,但是如果我将其作为指针,则它包含多个字符。请清除这一点,我对它的工作方式非常困惑。

2 个答案:

答案 0 :(得分:2)

字符串文字"NULL"是5个char s的数组(第五个是表示字符串结尾的空字符)。 C ++中的数组在内存中顺序排列。这意味着如果您有一个指向数组的 first 元素的指针,则可以使用简单的算术找到后续的元素。

因此,可以将C ++中的数组隐式转换为指向其第一个元素的指针。当您编写id = "NULL"时,将分配id指向5个字符的数组的第一个字符('N'开头的"NULL")。您的对象将被放置在内存中,如下所示:

Employee
+--------+
| name   |
|        |
+--------+
| id     |
|    +----------+
+--------+      |
| age    |      v
|        |    +-+-+---+---+---+----+
+--------+    | N | U | L | L | \0 |
| salary |    +---+---+---+---+----+
|        |
+--------+

由于其余字符按顺序排列在内存中,因此只需在存储在'U'的地址中添加一个字节,然后通过以下方式添加第一个id,即可找到'L'添加两个字节,等等。您可以一直添加一个字节,直到找到'\0'字符为止,这表明您已到达字符串的末尾。

答案 1 :(得分:0)

这是因为告诉编译器分配const char并指向长度为5的char数组类型的对象(因为NULL的长度为4,不包括空终止符)并使用字符串文字对其进行了初始化。

一切都很好,直到您取消引用它为止。这样做时,只会打印出N个字符,而不是完整的字符串。但是它们会连续存储在内存中,因此它们会被打印,直到\0中出现字符串文字std::cout的空终止符为止,然后再终止对该字符串的读取。

此外,请注意,一旦指向它们就无法更改它们的值,它们将不再可替换。


只需使用const char *即可在C ++中广泛使用这些字符串,则无需使用std::string