我开始学习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?
在外行人的条件下的解释将不胜感激,我仍在学习所有条款,因为我编码和研究,所以我喜欢你使用的任何编程术语的解释。
答案 0 :(得分:7)
通过说int *ptr = NULL;
你说“我正在声明一个名为ptr
的指针,我想指向位置0
(NULL
)。这就是它的全部说法。
现在,如果您尝试读取或写入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!