C - Null指针如何保持不变?

时间:2015-07-04 14:27:13

标签: c pointers constants

常量定义为固定值,程序无法更改。例如。直接值,如1, 2, 3, 'a',也定义常量,如#define CONSTANT 100

所以我正在阅读Null Pointer,

  

NULL指针是在几个标准库中定义的值为零的常量。

但是可以改变指针变量,证明:

#include <stdio.h>

int main()
{
    int *a = NULL; /* Declaration\Definition of pointer and initialization of NULL */
    int b; /* Regular Declaration\Definition of variable */

    a = &b; /* pointer now stores memory address of b variable */

    return 0;
}

因此,如果Null指针是常量,那我怎么编译它没有错误。

在此之前我也读过。

  

如果您没有要分配的确切地址,最好将NULL值分配给指针变量

因此,如果Null指针是常量,那么当案例出现时我们可以获取我们想要的地址,你怎么能分配它,常量不能改变。

7 个答案:

答案 0 :(得分:5)

出于同样的原因,这有效:

int x = 1;
x = 2;

您正在一个常量复制到一个可变变量中,然后改变该变量。这不会以任何方式影响常量,因为它是副本。

如果您复印一本书然后在副本中记下一张纸条,那么原书是否有相同的注释?

答案 1 :(得分:4)

NULL是一个常量。真的,真的。 a指向的位置是常量,这就是您在此处更改的内容:

a = &b; /* pointer now stores memory address of b variable */ 

答案 2 :(得分:4)

NULL具有常量值,您可以将其分配给任何变量。这并不意味着变量应该是恒定的。

e.g. const int a = 2;
     int b = a;    // this statement is valid

答案 3 :(得分:2)

int *a = NULL; /* Declaration\Definition of pointer and initialization of NULL */

您的评论必须更改如下,并且会明确

  

声明\指针的定义和NULL的初始化

NULL指针表示根据NULL的定义,在内存中没有地址的指针,或者保存地址0的内存。

答案 4 :(得分:2)

  

NULL指针是常量

这个措辞可能会产生误导(并且也存在缺陷):NULL是一个空指针常量。 NULL指针是指向NULL的指针。您可能偶然发现NULL指针,但无法更改NULL展开的内容,即空指针常量

int *ptr = NULL;
ptr = &variable; // ok

int *const ptr2 = NULL;
ptr2 = &variable; // fails: ptr2 is a const pointer

++NULL; // fails: expression not assignable

答案 5 :(得分:1)

标记为C,但从C++角度来看,请查看以下代码。

#include <iostream>

#define NULL 0
const int null = 0;

int main(){

    int var1 = NULL; //can do (copy NULL into var1)
    int var2 = null; //can do (copy null into var2)
    int &var3 = NULL; //can't do, NULL is not in memory so it can't be referenced
                      //same as doing int &var3 = 0
    const int &var4 = NULL; //can do, creates a constant reference for the value of NULL
                      // same as const int &var4 = 0
    int &var5 = null; //can't do, null is in memory thus can be referenced
                      //but the reference has to be a constant
    const int &var6 = null; //can do, references null with a constant reference 

    var1++; //can do
    var2++; // also can do
    var3++; //this is folly
    var4++; //can't do, it's a constant
    var5++; //this is also a folly
    var6++;  //can't do, it's a constant
    NULL++; //can't do NULL isn't a variable (lvalue), same as doing 0++
    null++; //can't do null is a constant

}

从上面的代码中,NULL不是常量变量,而是常量表达式。这是一个宏。宏是在编译时处理的常量表达式。

  

宏是代号的片段,它已被赋予名称。每当   使用该名称,它将被宏的内容替换。那里   是两种宏。它们的大部分区别在于它们的外观   当他们被使用。类似对象的宏类似于数据对象   used,类似函数的宏类似于函数调用。

我也这样做#define log std::cerr但它并没有使log成为一个变量,尽管它确实使它成为常量。宏可以像我在NULL上面那样重新定义。

另一方面,null是一个常量变量。任何指针或对它的引用也必须是常量以保持其不变性。但是它的值可以复制到另一个变量中,并且可以像var2一样改变该变量。

答案 6 :(得分:0)

空指针值实际上是一个常量:它是一个特定的固定值。 IOW:只有一个值表示使指针成为空指针

String表示空指针值。预处理器将通过 textual 替换替换其名称(与其他宏一样)。然后将文本传递给C编译器。

可以修改指针变量 OTOH。它可以设置为空指针值,使其成为空指针,但设置指针<没有问题/ em>到另一个值。完成此更改后,它不再是 空指针