为什么我们需要int * ptr = NULL ;?

时间:2019-11-29 16:27:13

标签: c pointers initialization declaration

我不太明白为什么在此示例中我们需要部分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));
    }
}

3 个答案:

答案 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;

其他答案也表明了这一点。