C++ 分配c++;数组到指针
在这段代码中,我们创建了一个const char指针id,因为它是一个char,所以它应该只存储一个元素地址。但在默认构造函数中,我们为该id指定了“NULL”,该id如何容纳4个字符? 在参数化构造函数中,我们传递i[]数组并将值赋给id,同样的,char id是如何保存完整数组的? 进一步说明为什么我们需要const charC++ 分配c++;数组到指针,c++,arrays,pointers,C++,Arrays,Pointers,在这段代码中,我们创建了一个const char指针id,因为它是一个char,所以它应该只存储一个元素地址。但在默认构造函数中,我们为该id指定了“NULL”,该id如何容纳4个字符? 在参数化构造函数中,我们传递i[]数组并将值赋给id,同样的,char id是如何保存完整数组的? 进一步说明为什么我们需要const char class Employee { public: string name; const char *id; i
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;
};
};
class员工
{
公众:
字符串名;
常量字符*id;
智力年龄;
长期工资;
雇员()
{
name=“NULL”;
id=“NULL”;
年龄=0;
工资=0;
};
//雇员(字符串n,字符id[],整数a,长s):姓名(n),id(id),年龄(a),薪水(s)
// {};
Employee(字符串n,常量字符i[],int a,long s)//const use krne k baighar warning a rhe
{
name=n;
id=i;
年龄=a;
工资=s;
};
void getData()
{
cout这是因为编译器被告知分配一个const char
,并指向一个具有长度为5的char数组类型的对象(因为NULL
is的长度为4,不包括NULL终止符),并且它是用字符串文本初始化的
在取消引用之前,一切都很好。这样做时,只会打印N
char,而不是完整的字符串。但它们连续存储在内存中,因此它们会一直打印,直到std::cout
中出现字符串文本\0
的空终止符,以便在读取字符串后终止读取
另外,请注意,一旦它们被指向,就不能更改它们的值,因为它们不再是可替换的
不需要使用<代码> const char */Cuff>当您可以简单地使用C++代码:STD::String 在C++中广泛使用这些字符串时,
< P>这是因为编译器被告知要分配一个<代码> conchchar < /C> >,并指向一个长度为5的char数组对象。(因为NULL
is的长度为4,不包括NULL终止符),并且它是用字符串文本初始化的
在取消引用之前,一切都很好。这样做时,只会打印N
char,而不是完整的字符串。但它们连续存储在内存中,因此它们会一直打印,直到std::cout
中出现字符串文本\0
的空终止符,以便在读取字符串后终止读取
另外,请注意,一旦它们被指向,就不能更改它们的值,因为它们不再是可替换的
不需要使用<代码> const char */Cube >当你可以简单地使用C++代码:STD::String 在C++中广泛使用那些字符串。
< p>字符串文字>代码> null(< null)<代码>,是一个数组5代码> char < /c> > s(第五是一个空字符来表示字符串的结尾)C++中的数组是按顺序排列在内存中的。这意味着如果你有一个指向数组第一元素的指针,你可以用简单的算术找到后续元素。
因为C++中的数组可以隐式转换为指向第一个元素的指针。当你写代码“ID=“null”< /CUL>时,<代码> ID/CUT>将被分配给5个字符数组的第一个字符(<代码> n '/COD>在代码开始>“null”< /代码>).您的对象将被放置在内存中,如下所示:
Employee
+--------+
| name |
| |
+--------+
| id |
| +----------+
+--------+ |
| age | v
| | +-+-+---+---+---+----+
+--------+ | N | U | L | L | \0 |
| salary | +---+---+---+---+----+
| |
+--------+
由于其余字符在内存中按顺序排列,只需向id
中存储的地址添加一个字节,就可以找到'U'
,而第一个'L'
则可以添加两个字节,以此类推。您可以不断添加一个字符,直到找到'\0'
字符,这表示您已经到达了t的末尾字符串。字符串文本“NULL”
,是一个由5个字符组成的数组(第五个是空字符,表示字符串的结尾)C++中的数组是按顺序排列在内存中的。这意味着如果你有一个指向数组第一元素的指针,你可以用简单的算术找到后续元素。
因为C++中的数组可以隐式转换为指向第一个元素的指针。当你写代码“ID=“null”< /CUL>时,<代码> ID/CUT>将被分配给5个字符数组的第一个字符(<代码> n '/COD>在代码开始>“null”< /代码>).您的对象将被放置在内存中,如下所示:
Employee
+--------+
| name |
| |
+--------+
| id |
| +----------+
+--------+ |
| age | v
| | +-+-+---+---+---+----+
+--------+ | N | U | L | L | \0 |
| salary | +---+---+---+---+----+
| |
+--------+
由于其余字符在内存中按顺序排列,只需向id
中存储的地址添加一个字节,就可以找到'U'
,而第一个'L'
则可以添加两个字节,以此类推。您可以不断添加一个字符,直到找到'\0'
字符,这表示您已经到达了t的末尾字符串。id
是指针,它“保存”的唯一内容是对象的地址,而不是“保存”整个数组你知道它有多少字符吗?如果你使用<代码> STD::String < /Cord> > <代码>名称<代码>,为什么是<代码> ID >代码> A<代码> char */COD>?是的,它很有趣。在C和C++中,指向单个字符的指针也被用来指向第一个(或任何!)整个数组中的字符。无法从语言中推断出哪一个元素的含义,您必须查看代码和文档。如果使用指针指向数组中的第一个元素,通常会有一个长度,因为没有其他通用方法可以知道第一个元素后面存储了多少个元素。(对于可打印字符,可以(标准库函数也可以)查找终止的零字节,但对于二进制数据,这将失败。)@drescherjm注意到id
本身不是const,它指向const。您可以在程序中更改它指向的内容。事实上,如果它是const,您甚至无法在构造函数中为它赋值;您必须初始化它