我不太明白为什么在此示例中我们需要部分int *ptr = NULL;
。我知道指针是什么,但是为什么在这里需要这个*(指向附加到地址的值)?为什么我们这里需要NULL?
#include <stdio.h>
int main() {
int a[5] = {22, 33, 44, 55, 66};
int *ptr = NULL;
int i;
ptr = a;
for (i = 0; i < 5; i++) {
printf("%d ", *(ptr + i));
}
}
答案 0 :(得分:3)
此中间初始化
int *ptr = NULL;
是多余的。你可以马上写
int *ptr = a;
此外,这种初始化是不好的编程风格。每个变量应在使用的地方声明和初始化。否则,代码会使您感到困惑,从而使用户感到困惑。
我将以以下方式重写程序
#include <stdio.h>
int main( void )
{
int a[] = { 22, 33, 44, 55, 66 };
const size_t N = sizeof( a ) / sizeof( *a );
for ( const int *ptr = a; ptr != a + N; ++ptr )
{
printf( "%d ", *ptr );
}
putchar( '\n' );
}
在某些情况下,可以在各种上下文中使用相同的一个指针。在这种情况下,有必要声明它并使用NULL初始化。但是您的简单程序却并非如此。
答案 1 :(得分:2)
在您的情况下,int *ptr = NULL
完全是多余的,就像您可以像Vlad所说的那样写int *ptr = a
一样,但是更一般地说,初始化指向NULL
的指针是一个好主意,因为如果由于某种原因,您的代码中有错误并且需要调试,如果指针以NULL
开头,则调试指针所发生的事情要比未初始化并填充它要容易得多。有一些垃圾值。
答案 2 :(得分:1)
我不太明白为什么在此示例中我们需要部分
int *ptr = NULL;
。
[...]
为什么在这里需要这个*(指向附加到地址的值)?
您误解了*
的重要性。在这种情况下,它不是一元*
运算符。相反,它是声明类型为指针类型的变量的语法的一部分。该声明将ptr
声明为int *
类型的变量,即即整数指针。如果没有*
,则声明将ptr
的类型指定为int
,而不是指针类型。
为什么我们这里需要NULL?
你不知道。 = NULL
是变量ptr
的 initializer ,定义了它的初始值,但是在读取变量之前给该变量分配了一个不同的值,因此初始化器没有实际意义。
有些人倾向于提供这样的初始化器,这当然是基于这样的理论,即它避免了意外使用野生指针和/或允许检测到(否则)未初始化的指针,但正如艾默生所写的那样,“愚蠢的一致性是小头脑的妖精。”初始化程序在此特定代码中无用。如果坚持要提供初始化程序,则没有理由不将ptr
直接初始化为a
:
int *ptr = a;
其他答案也表明了这一点。