C++ 指针是第一个、新指针还是临时空指针?

C++ 指针是第一个、新指针还是临时空指针?,c++,object,pointers,struct,null,C++,Object,Pointers,Struct,Null,我是初学者。所以,我很难理解链表以及指针在创建第一项或最后一项时的行为等等。一旦创建了新类型(student)的结构(指针指向自身)和该结构的对象,就有三个指针。“第一”、“新”和“临时”。它们是否总是空指针(包括“链接”指针)?我的意思是,一旦它们被声明,我就知道以后它们必须更改地址和/或值。如果(!ptr)命令说它们是。若总是这样的话,我可以更好地理解进一步代码的原理。在所有教程和讲座中,指针必须声明为空指针才能变为空指针。Tnx #include <iostream> usin

我是初学者。所以,我很难理解链表以及指针在创建第一项或最后一项时的行为等等。一旦创建了新类型(student)的结构(指针指向自身)和该结构的对象,就有三个指针。“第一”、“新”和“临时”。它们是否总是空指针(包括“链接”指针)?我的意思是,一旦它们被声明,我就知道以后它们必须更改地址和/或值。如果(!ptr)命令说它们是。若总是这样的话,我可以更好地理解进一步代码的原理。在所有教程和讲座中,指针必须声明为空指针才能变为空指针。Tnx

#include <iostream>
using namespace std;

typedef struct student { 
    char* first_name;
    char* last_name;
    char* smth;
    student* link; // is this null pointer??
}student;

student* first, *new;   //
student* temp;          // are these null pointers?  

// here is whole thing... pointers "translated"
#include <iostream>
#pragma GCC diagnostic ignored "-Wwrite-strings"

using namespace std;

typedef struct student {
    char* name;
    char* last_name;
    char* rnmb;
    student* next;
} student;

student *poc, *s;
student *temp;     

void make_new (char name[10], char last_name[10], char rnmb[5]){ 
    s = new student;
    s->name = name; 
    s->last_name = last_name;
    s->rnmb = rnmb;
    s->next = NULL; 
}

void add_at_b (char name[10], char last_name[10], char rnmb[5]) {
    make_new (name, last_name, rnmb);
    s->next = poc; 
    poc = s;
    }   

void add_at_end (char name[10], char last_name[10], char rnmb[5]) {
    make_new (name, last_name, rnmb);
    if (!poc) {
        poc = s;
    } else {
        temp = poc;
        while  (temp->next) temp = temp->next;
        temp->next = s;
    }
}

void stu_del (char name[10]) {
    temp = poc;
    while (temp->next) {
        if (temp->next->name == name) {
            delete temp->next;
            temp->next = temp->next->next;
        }
        temp = temp->next;
    }
}


void stu_del_all () {
    student *cpy;
    temp = poc;
    while (temp) {
        cpy=temp;
        temp=temp->next;
        delete cpy;
    }
    poc = NULL;
}

int main()
{
    add_at_b("John", "Doe", "4323");
    add_at_end("John jr.", "DoeII", "4323");
    add_at_b("Ma", "Mar", "4323");
    stu_del("John");
    //stu_del_all ();
    if (poc == NULL) cout << "List is empty" << endl;
   return 0;
}
#包括
使用名称空间std;
类型定义结构学生{
char*名字;
字符*姓氏;
char*smth;
student*link;//这是空指针吗??
}学生;
学生*第一,*新//
学生*temp;//这些是空指针吗?
//这是整件事。。。指针“翻译”
#包括
#已忽略pragma GCC诊断“-Wwrite字符串”
使用名称空间std;
类型定义结构学生{
字符*名称;
字符*姓氏;
字符*rnmb;
学生*下一位;
}学生;
学生*poc,*s;
学生*临时工;
void make_new(char name[10],char last_name[10],char rnmb[5]){
s=新生;
s->name=name;
s->last_name=last_name;
s->rnmb=rnmb;
s->next=NULL;
}
void add_at_b(字符名[10],字符姓氏[10],字符rnmb[5]){
新建(姓名、姓氏、rnmb);
s->next=poc;
poc=s;
}   
void add_在_末尾(char name[10],char last_name[10],char rnmb[5]){
新建(姓名、姓氏、rnmb);
如果(!poc){
poc=s;
}否则{
温度=poc;
而(临时->下一步)临时=临时->下一步;
温度->下一步=s;
}
}
void stu_del(字符名[10]){
温度=poc;
while(临时->下一步){
如果(临时->下一步->名称==名称){
删除临时->下一步;
临时->下一步=临时->下一步->下一步;
}
温度=温度->下一步;
}
}
无效斯图_del_all(){
学生*cpy;
温度=poc;
while(临时){
cpy=温度;
温度=温度->下一步;
删除cpy;
}
poc=NULL;
}
int main()
{
在“约翰”、“能源部”、“4323”中添加“能源部”;
在末尾加上“(“小约翰”、“多伊”、“4323”);
在b(“Ma”、“Mar”、“4323”)处添加;
斯图·德尔(“约翰”);
//stu_del_all();

if(poc==NULL)cout全局范围中定义的内置类型的对象被初始化为全零。因此
first
last
temp
都是空指针


link
是类型定义的一部分。代码不创建任何
student
对象,因此不存在
link
指针,因此不存在null
link
指针。

这些变量似乎是在全局命名空间中声明的(即在函数外部),在这种情况下是:

但是,如果它们是在函数中声明的,则情况并非如此,您需要显式编写:

student* first = nullptr;
不管怎么说,没有什么能阻止你在他们所在的地方写这些东西

link
不是
nullptr
,因为
link
什么都不是。
link
还不存在,因为你所有的都是指向什么都没有的指针

这里有一些不好的做法(
使用namespace std;
typedef struct
),因此您可以简单地将代码重构为以下内容:

struct student
{
    std::string first_name;
    std::string last_name;
    student* link = nullptr;
};
这是成员变量的声明。在创建
student
对象之前,不存在
link
指针

student* first, *new;   //
student* temp;          // are these null pointers?  
具有静态存储持续时间的变量初始化为零(在进一步初始化之前,如果有的话)。因此,这些最初是空指针。除了
new
,它是关键字,因此是格式错误的变量名

有三个指针。“第一”、“新”和“临时”。它们总是空指针吗

取决于您如何初始化
student
对象。有许多不同的语法可用于初始化对象

如果您对其进行了默认初始化,则不能保证它们为null-默认初始化指针具有不确定值。除非对象具有静态存储,在这种情况下,它是零初始化的,如我上面所述。如果读取不确定值,则程序的行为将不确定(某些例外情况适用)

如果已初始化对象的值,则这些指针将为空


如果已对对象进行列表初始化,则这些指针将具有在初始化器表达式中给定的值。缺少初始化器的指针成员将进行值初始化,因此将为空。

听起来您可以使用a。您是否指示它们是在函数外部还是在函数中声明的?It看起来像是在函数之外。我在提供的代码段中没有看到空指针。但是,我看到
使用名称空间std
,这是一种不好的做法,变量名为
new
,这是一种语法错误。但是,
first
temp
和名称不正确的
new
可能是空指针,如果它们被声明为n命名空间范围。您只有.Whoops,
new
是一个关键字,因此它不能是指针的名称。
student* first, *new;   //
student* temp;          // are these null pointers?