在这段代码中,我们创建了一个常量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类型只能存储单个字符,但如果我使它成为一个指针,那么它将容纳许多字符。 请澄清这一点,我很困惑,因为它是如何工作的。
字符串文本“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;
演示