C++中的空指针声明混淆
Null pointers declaration confusion in C++
我开始学习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?
将不胜感激通俗易懂的解释,我在编写代码和研究时仍在学习所有术语,因此我很乐意解释您使用的任何编程术语。
通过说 int *ptr = NULL;
你是在说“我正在声明一个名为 ptr
的 int 指针,我想指向位置 0
(NULL
)。那是这一切都在说。
现在,如果您尝试读取或写入 ptr
,您将得到 未定义的行为,这通常是一个糟糕的地方(比仅仅得到更糟糕一个错误,因为你的程序可能会在其他地方开始出现问题,而你不知道为什么)。但一般来说,NULL
指针用于表示不应该使用且必须初始化的情况。
正如大卫施瓦茨所说,
It will be easier to understand if you use int* ptr
instead of int *ptr
.
这是因为ptr
的类型实际上是int*
,一个指向整数的指针。声明类型时,*
表示指针。只有在 *ptr = 20
等表达式中使用指针时,*
才表示 "dereference".
NO. 你看到 *
运算符和 ptr
的任何地方都意味着解除引用,除了第一次。当你这样做时
int *ptr = 0;
*
使 ptr
成为一个整数指针并将其指向空地址,内存中的 "zero-th" 位置
在现代 C++ 中更好的用法是
int *ptr = nullptr;
这意味着您的 ptr
在内存中没有可引用的位置。
nullptr
的类型是 nullptr_t
,它不是整数或任何其他类型。它更安全,而不是依赖于宏 NULL。由于 NULL
如果定义为 0
可以转换为整数,并且在处理函数参数和其他情况时会产生问题。
在
int *ptr = NULL;
*
不是 *
运算符。 *
字符只是指针声明符语法的一部分。它与 *
运算符无关。
表达式中使用了运算符。上面的 *ptr
是声明中的声明符。声明符不是表达式。该声明符中没有运算符,即使某些字符看起来像 "operators".
由于 C++11 别名模板,您可以用常规模板语法替换奇怪的 T*
语法:
template<typename T> using pointer = T*;
pointer<int> ptr = nullptr;
用最简单的话来说:
int *ptr = NULL;
意味着有一个名为 ptr 的指针被赋值为 NULL,这意味着现在它没有指向任何地方(不是任何垃圾值或其他任何东西)它的值为 NULL!
我开始学习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?
将不胜感激通俗易懂的解释,我在编写代码和研究时仍在学习所有术语,因此我很乐意解释您使用的任何编程术语。
通过说 int *ptr = NULL;
你是在说“我正在声明一个名为 ptr
的 int 指针,我想指向位置 0
(NULL
)。那是这一切都在说。
现在,如果您尝试读取或写入 ptr
,您将得到 未定义的行为,这通常是一个糟糕的地方(比仅仅得到更糟糕一个错误,因为你的程序可能会在其他地方开始出现问题,而你不知道为什么)。但一般来说,NULL
指针用于表示不应该使用且必须初始化的情况。
正如大卫施瓦茨所说,
It will be easier to understand if you use
int* ptr
instead ofint *ptr
.
这是因为ptr
的类型实际上是int*
,一个指向整数的指针。声明类型时,*
表示指针。只有在 *ptr = 20
等表达式中使用指针时,*
才表示 "dereference".
NO. 你看到 *
运算符和 ptr
的任何地方都意味着解除引用,除了第一次。当你这样做时
int *ptr = 0;
*
使 ptr
成为一个整数指针并将其指向空地址,内存中的 "zero-th" 位置
在现代 C++ 中更好的用法是
int *ptr = nullptr;
这意味着您的 ptr
在内存中没有可引用的位置。
nullptr
的类型是 nullptr_t
,它不是整数或任何其他类型。它更安全,而不是依赖于宏 NULL。由于 NULL
如果定义为 0
可以转换为整数,并且在处理函数参数和其他情况时会产生问题。
在
int *ptr = NULL;
*
不是 *
运算符。 *
字符只是指针声明符语法的一部分。它与 *
运算符无关。
表达式中使用了运算符。上面的 *ptr
是声明中的声明符。声明符不是表达式。该声明符中没有运算符,即使某些字符看起来像 "operators".
由于 C++11 别名模板,您可以用常规模板语法替换奇怪的 T*
语法:
template<typename T> using pointer = T*;
pointer<int> ptr = nullptr;
用最简单的话来说:
int *ptr = NULL;
意味着有一个名为 ptr 的指针被赋值为 NULL,这意味着现在它没有指向任何地方(不是任何垃圾值或其他任何东西)它的值为 NULL!