提问者:小点点

将C++数组分配给指针


在这段代码中,我们创建了一个常量char指针id,因为它是一个char,所以它应该只存储一个元素地址。 但是在默认构造函数中,我们将“NULL”赋给了那个id,那么这个id是如何保存4个字符的呢? 在参数化构造函数中,我们传递i[]数组并将值赋给id,同样,char id是如何保存完整数组的? 此外,为什么我们需要常量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是字符,那么它是如何保持一个5个字符字符串文字。 CHAR类型只能存储单个字符,但如果我使它成为一个指针,那么它将容纳许多字符。 请澄清这一点,我很困惑,因为它是如何工作的。


共3个答案

匿名用户

字符串文本“null”是由5个字符组成的数组(第五个字符是空字符,用于表示字符串的结尾)。 C++中的数组在内存中按顺序排列。 这意味着如果你有一个指向数组第一个元素的指针,你就可以使用简单的算术找到后续的元素。

正因为如此,C++中的数组可以隐式转换为指向其第一个元素的指针。 当您编写id=“null”时,将分配id以指向该5个字符数组的第一个字符(“null”开头的'N')。 对象在内存中的布局如下:

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

由于其余字符在内存中按顺序排列,您只需向存储在ID中的地址添加一个字节即可找到'U',并通过添加两个字节来找到第一个'L'。您可以继续添加一个,直到找到一个'\0'字符,该字符表示您已经到达字符串的末尾。

匿名用户

这是因为编译器被告知分配一个const char,并被指向一个长度为5的char数组类型的对象(因为null的长度为4,不包括null终止符),并且它是用字符串文字初始化的。

在你取消引用之前一切都很好。 这样做时,只会打印n字符,而不会打印完整的字符串。 但是它们是连续存储在内存中的,所以它们会被打印,直到std::cout中出现字符串文本\0的空终止符,从而在此之后终止对字符串的读取。

此外,请注意,一旦它被指向,您就不能更改它们的值,它们不再是可替换的。

当您可以简单地使用std::string在C++中广泛使用这些字符串时,您不需要使用const char*

匿名用户

id=“null”;语句使id指向长度为4的字符串文本“null”,但实际上包含与空字符\0一起计数的5个字符。

指针必须是const,因为字符串文本是只读的,所以不能更改,例如,像id[0]='a';这样的操作是非法的,所以C++禁止向字符串文本提供非const指针。

编辑(在注释之后)

类型char保存1个字符,类型char*保存一个地址,如果您为它分配字符数组,它将保存所述字符数组的初始地址。 换句话说,它将指向数组的第一个元素。

检查此示例:

const char *array = "NULL"; //string literal

// a pointer to the the first element of the char array 
// i.e. the address of its first element
const char* ptr = &array[0];

//same as
const char* ptr = array; 
//because the name of the array is effectively a pointer to its first element

// ptr holds the address of the first element of the char array, all characters
// of the array are printed, i.e. until null terminator is found. 
std::cout << ptr; 

演示

相关问题


MySQL Query : SELECT * FROM v9_ask_question WHERE 1=1 AND question regexp '(c++|数组|分配给|指针)' ORDER BY qid DESC LIMIT 20
MySQL Error : Got error 'repetition-operator operand invalid' from regexp
MySQL Errno : 1139
Message : Got error 'repetition-operator operand invalid' from regexp
Need Help?