首页 > 解决方案 > 将 c++ 数组分配给指针

问题描述

在这段代码中,我们创建了一个 const char 指针 id,因为它是一个 char,所以它应该只存储一个元素地址。但是在默认构造函数中,我们将“NULL”分配给该 id,该 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 类型只能存储单个字符,但如果我将其设为指针,则它包含多个字符。请清除这一点,我很困惑它是如何工作的。

标签: c++arrayspointers

解决方案


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

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

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

由于其余字符在内存中按顺序排列,因此您可以'U'简单地通过将一个字节添加到存储在中的地址来找到第一个字节id,然后'L'通过添加两个字节等来找到第一个字节。您可以继续添加一个直到找到一个'\0'字符,这表示您已到达字符串的末尾。


推荐阅读