Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/135.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 分配c++;数组到指针_C++_Arrays_Pointers - Fatal编程技术网

C++ 分配c++;数组到指针

C++ 分配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

在这段代码中,我们创建了一个const char指针id,因为它是一个char,所以它应该只存储一个元素地址。但在默认构造函数中,我们为该id指定了“NULL”,该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;
        };

};
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,您甚至无法在构造函数中为它赋值;您必须初始化它