C ++中的空指针声明混淆

时间:2015-06-25 20:45:11

标签: c++ null-pointer

我开始学习C ++。我遇到了关于指针的小混乱,特别是NULL指针。根据我的理解,当您声明指针并将其设置为指向值时,您可以执行以下操作:

    int var = 10;
    int *ptr;
    ptr = &var;
    *ptr = 20;

这会将var的值更改为20.但是当您设置NULL指针时,请执行以下操作:

int *ptr = NULL;

这是不是意味着你将值NULL分配给ptr指向的任何变量而不是地址,因为*运算符?我认为一个NULL指针的值(它的地址)为0,所以它从我读到的地方找不到任何地方。这样做是否更有意义:

int *ptr;
ptr = NULL // or 0?

在外行人的条件下的解释将不胜感激,我仍在学习所有条款,因为我编码和研究,所以我喜欢你使用的任何编程术语的解释。

6 个答案:

答案 0 :(得分:7)

通过说int *ptr = NULL;你说“我正在声明一个名为ptr的指针,我想指向位置0NULL)。这就是它的全部说法。

现在,如果您尝试读取或写入ptr,您将获得未定义的行为,这通常是一个可怕的地方(比仅仅收到错误更糟糕,因为您的程序可能会开始在其他地方遇到问题,你不会知道为什么)。但通常情况下,当您想要表示不应该使用{且必须初始化时}时,会使用NULL指针。

正如David Schwartz所说,

  

如果您使用int* ptr而不是int *ptr,则会更容易理解。

这是因为ptr的类型实际上是int*,是指向整数的指针。声明类型时,*表示指针。只有在*ptr = 20等表达式中使用指针时,*才意味着“取消引用”。

答案 1 :(得分:2)

由于C ++ 11别名模板,您可以使用常规模板语法替换奇怪的T*语法:

template<typename T> using pointer = T*;

pointer<int> ptr = nullptr;

答案 2 :(得分:1)

std::string reverseParse()
{
    rapidjson::Document doc;
    doc.SetObject();
    rapidjson::Document::AllocatorType& allocator = doc.GetAllocator();

    doc.AddMember("name", this->name.c_str(), doc.GetAllocator());
    doc.AddMember("age", this->age, doc.GetAllocator());

    rapidjson::StringBuffer buffer;
    rapidjson::Writer<rapidjson::StringBuffer> writer(buffer);
    doc.Accept(writer);

    return buffer.GetString();
}

int *ptr = NULL; *运营商。 *字符只是指针声明符语法的一部分。它与*运算符无关。

运算符用于表达式。上面的*是声明中的声明者。声明者不是表达式。即使某些字符看起来像“运算符”,该声明符中也没有运算符。

答案 3 :(得分:0)

NO。您看到*运算符ptr的所有地方都意味着首次取消引用EXCEPT。当你这样做

int *ptr = 0;

*使ptr成为整数指针并指向空地址,&#34;零&#34;记忆中的位置

答案 4 :(得分:0)

在现代C ++中,更好的用法是

int *ptr = nullptr;

这意味着您的ptr在内存中没有依赖的位置。

nullptr的类型为nullptr_t,它不是整数或任何其他类型。取决于宏NULL,它更安全。由于NULL被定义为0,因此class Question(models.Model): question_text = models.CharField(max_length=200) pub_date = models.DateTimeField('date published') def __str__(self): return self.question_text def was_published_recently(self): return self.pub_date >= timezone.now() - datetime.timedelta(days=1) was_published_recently.admin_order_field = 'pub_date' was_published_recently.boolean = True was_published_recently.short_description = 'Published recently?' class Choice(models.Model): #question = models.ForeignKey('Question') related_question = models.ManyToManyField(Question, related_name='questions') choice_text = models.CharField(max_length=200) votes = models.IntegerField(default=0) def __str__(self): return self.choice_text class Related(models.Model): question = models.ForeignKey(Question) choice = models.ForeignKey(Choice) 可以转换为整数,并且在处理函数参数和其他场景时可能会产生问题。

答案 5 :(得分:0)

用最简单的话说:

int *ptr = NULL; 

表示有一个名为ptr的指针,它已被赋值等于NULL,这意味着它现在没有指向任何地方(不是任何垃圾值或其他任何东西),它的值为NULL!