将c++数组分配给指针

assigning c++ array to pointer

本文关键字:指针 分配 数组 c++      更新时间:2023-10-16

在这段代码中,我们制作了一个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类型只能存储单个字符,但如果我将其作为指针,那么它将包含多个字符。请澄清这一点,我很困惑它是如何工作的。

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

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

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

由于其余的字符是按顺序排列在内存中的,您可以通过向存储在id中的地址添加一个字节来找到'U',通过添加两个字节来查找第一个'L',等等。您可以不断添加一个,直到找到一个''字符,这表示您已到达字符串的末尾。

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

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

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


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