首先是指针,新的和临时的空指针吗?
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
是语法错误。但是,first
、temp
和错误命名的 new
可能是空指针,如果它们是在命名空间范围内声明的。
你只有uninitialized variables。
哎呀,new
是关键字,所以不能是指针的名称。
【参考方案1】:
在全局范围内定义的内置类型的对象被初始化为全零。所以first
、last
、temp
都是空指针。
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
对象。有许多不同的语法可用于初始化对象。
如果你已经默认初始化它,那么它们不能保证为空 - 默认初始化的指针有一个不确定的值。除非对象具有静态存储,在这种情况下,它是零初始化的,正如我上面提到的。如果您读取一个不确定的值,程序的行为将是未定义的(有一些例外)。
如果你已经初始化了对象的值,那么那些指针将为空。
如果您已经对对象进行了列表初始化,那么这些指针将具有您在初始化表达式中给出的值。那些缺少初始化器的指针成员将被初始化,因此将为空。
【讨论】:
以上是关于首先是指针,新的和临时的空指针吗?的主要内容,如果未能解决你的问题,请参考以下文章
SpringBug记录 -- java.lang.NullPointerException在Spring单元测试中遇到的空指针异常及依赖注入异常总结