присвоение массива c ++ указателю - PullRequest
0 голосов
/ 14 июля 2020

В этом коде мы сделали идентификатор указателя const char, так как это char, поэтому он должен хранить только один адрес элемента. но в конструкторе по умолчанию мы присвоили этому идентификатору «NULL», как этот идентификатор содержит 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 ]

2 голосов
/ 14 июля 2020

Строковый литерал "NULL" представляет собой массив из 5 char s (пятый - нулевой символ, обозначающий конец строки). В C ++ массивы располагаются в памяти последовательно. Это означает, что если у вас есть указатель на первый элемент массива, вы можете найти последующие элементы, используя простую арифметику c.

Из-за этого массивы в C ++ могут быть неявно преобразованы в указатель на их первый элемент. Когда вы напишете id = "NULL", id будет назначено для указания на первый символ этого массива из 5 символов ('N' в начале "NULL"). Ваш объект будет размещен в памяти примерно так:

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

Поскольку остальные символы расположены в памяти последовательно, вы можете найти 'U', просто добавив один байт к сохраненному адресу в id и первый 'L', добавив два байта, et c. Вы можете добавлять единицу, пока не найдете символ '\0', который сигнализирует, что вы достигли конца строки.

0 голосов
/ 14 июля 2020

Это потому, что компилятору сказано выделить const char и указать объект с массивом типа char с длиной 5 (поскольку NULL имеет длину 4, исключая нулевой терминатор), и он инициализируется с помощью строковый литерал.

Все хорошо, пока вы не разыменовываете его. Когда вы это сделаете, вы получите только N char, а не всю строку. Но они хранятся в памяти непрерывно, поэтому они печатаются до тех пор, пока в std::cout не появится нулевой ограничитель для строкового литерала \0, чтобы завершить чтение строки после него.

Также обратите внимание, что вы можете не меняют их значения после того, как они наведены, их больше нельзя заменить.

Вам не нужно использовать const char *, если вы можете просто использовать std::string для обширной работы с этими строками в C ++.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...