Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/140.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++中空指针声明混淆 我开始学习C++。我遇到了一个关于指针的小混乱,特别是空指针。根据我的理解,当您声明一个指针并将其设置为指向一个值时,您可以执行以下操作: int var = 10; int *ptr; ptr = &var; *ptr = 20; int *ptr = NULL;_C++_Null Pointer - Fatal编程技术网

C++中空指针声明混淆 我开始学习C++。我遇到了一个关于指针的小混乱,特别是空指针。根据我的理解,当您声明一个指针并将其设置为指向一个值时,您可以执行以下操作: int var = 10; int *ptr; ptr = &var; *ptr = 20; int *ptr = NULL;

C++中空指针声明混淆 我开始学习C++。我遇到了一个关于指针的小混乱,特别是空指针。根据我的理解,当您声明一个指针并将其设置为指向一个值时,您可以执行以下操作: int var = 10; int *ptr; ptr = &var; *ptr = 20; int *ptr = NULL;,c++,null-pointer,C++,Null Pointer,这会将var的值更改为20。但当设置空指针时,需要执行以下操作: int var = 10; int *ptr; ptr = &var; *ptr = 20; int *ptr = NULL; 这是否意味着由于*运算符的缘故,您将NULL值赋给ptr指向的变量而不是地址?我认为空指针的地址值为0,所以从我读到的内容来看,它不指向任何地方。这样做是否更有意义: int *ptr; ptr = NULL // or 0? 一个外行术语的解释将不胜感激,我

这会将var的值更改为20。但当设置空指针时,需要执行以下操作:

    int var = 10;
    int *ptr;
    ptr = &var;
    *ptr = 20;
int *ptr = NULL;
这是否意味着由于*运算符的缘故,您将NULL值赋给ptr指向的变量而不是地址?我认为空指针的地址值为0,所以从我读到的内容来看,它不指向任何地方。这样做是否更有意义:

int *ptr;
ptr = NULL // or 0?
一个外行术语的解释将不胜感激,我仍然在学习所有的术语,因为我的代码和研究,所以我希望您使用的任何编程术语的解释

表示int*ptr=NULL;您的意思是我正在声明一个名为ptr的int指针,我要指向位置0 NULL。这就是它所说的

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

正如大卫·施瓦茨所说


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

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

否。无论在哪里,只要看到带有ptr的*运算符,它都意味着取消引用,除了第一次。当你这样做的时候

int *ptr = 0;

*将PTR设为一个整数指针,指向空地址,在内存中的零位置,

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

int *ptr = nullptr;
这意味着您的ptr在内存中没有尊重的位置

nullptr的类型是nullptr\t,它不是整数或任何其他类型。相反,依赖于宏NULL更安全。因为如果NULL定义为0,则可以将其转换为整数,并且在处理函数参数和其他场景时可能会产生问题。

int *ptr = NULL;
*不是*运算符。*字符只是指针声明符语法的一部分。它与*操作符没有任何关系

运算符用于表达式中。上面的*ptr是声明中的声明器。声明器不是一个表达式。该声明符中没有运算符,即使某些字符看起来像运算符。

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

template<typename T> using pointer = T*;

pointer<int> ptr = nullptr;
用最简单的话来说:

int *ptr = NULL; 

意味着有一个名为ptr的指针被赋值为NULL,这意味着它现在没有指向任何地方,也没有指向任何垃圾值或任何其他它有NULL值的地方

这与int*ptr=&var是一样的。在本例中,*不是运算符,只是类型的一部分。使用int*ptr而不是int*ptr会更容易理解。@DavidSchwartz不幸的是,这与语言-int*ptr,a;变得混乱,是指针吗?而int*ptr,a;很明显,它不是。int*ptr=NULL;只是int*ptr的缩写;ptr=NULL@斯拉瓦:不管怎样,有些事情令人困惑。这是一个更糟糕的选择;甚至更好。