首先是指针,新的和临时的空指针吗?

Posted

技术标签:

【中文标题】首先是指针,新的和临时的空指针吗?【英文标题】:Are pointers first, new and temp null pointers? 【发布时间】:2019-01-14 22:12:57 【问题描述】:

我是初学者。所以,我很难理解链表以及指针在创建第一项或最后一项时的行为等等。一旦创建了 new_type (student) 的结构(带有指向自身的指针),并且该结构的对象,就有三个指针。 “第一”、“新”和“临时”。它们总是空指针(包括“链接”指针)吗?我的意思是,一旦他们被宣布,我明白他们以后必须改变地址和/或价值。如果 (!ptr) 命令说它们是。如果总是这样,我可以更好地理解进一步代码的原理。在所有教程和讲座中,必须将指针声明为空指针才能变为 1。 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;

【问题讨论】:

听起来你可以使用good C++ book 你是说它们是在函数之外还是在函数中声明的?看起来这些将在函数之外 我在提供的 sn-p 中看不到空指针。但是,我看到 using namespace std 是不好的做法,变量名为 new 是语法错误。但是,firsttemp 和错误命名的 new 可能是空指针,如果它们是在命名空间范围内声明的。 你只有uninitialized variables。 哎呀,new 是关键字,所以不能是指针的名称。 【参考方案1】:

在全局范围内定义的内置类型的对象被初始化为全零。所以firstlasttemp都是空指针。

link 是类型定义的一部分。代码没有创建任何student对象,所以没有link指针,所以也没有空的link指针。

【讨论】:

【参考方案2】:

这些变量似乎是在全局命名空间中声明的(即在函数之外),在这种情况下是:they are initialised to nullptr.

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

student* first = nullptr;

无论如何,没有什么能阻止你写下它们。

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

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

struct student

    std::string first_name;
    std::string last_name;
    student* link = nullptr;
;

【讨论】:

【参考方案3】:
typedef struct student  
    char* first_name;
    char* last_name;
    char* smth;
    student* link; // is this null pointer??
student;

这是一个成员变量的声明。在创建 student 对象之前,不存在 link 指针。

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

具有静态存储持续时间的变量被初始化为零(在进一步初始化之前,如果有的话)。因此,这些最初是空指针。 new 除外,它是关键字,因此是一个格式错误的变量名。

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

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

如果你已经默认初始化它,那么它们不能保证为空 - 默认初始化的指针有一个不确定的值。除非对象具有静态存储,在这种情况下,它是零初始化的,正如我上面提到的。如果您读取一个不确定的值,程序的行为将是未定义的(有一些例外)。

如果你已经初始化了对象的值,那么那些指针将为空。

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

【讨论】:

以上是关于首先是指针,新的和临时的空指针吗?的主要内容,如果未能解决你的问题,请参考以下文章

捕获空指针异常是代码异味吗?

java中的空指针异常怎么解决

使用 Eclipse 插件追加新谷歌的空指针异常

SpringBug记录 -- java.lang.NullPointerException在Spring单元测试中遇到的空指针异常及依赖注入异常总结

Java中的空指针问题。

Kotlinkotlin中的空指针检查