将c++数组分配给指针
assigning c++ array to pointer
在这段代码中,我们制作了一个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个char
s组成的数组(第五个是空字符,表示字符串结束(。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
中出现字符串文字