/ Programming

C语言的常量与指针问题

常量的声明

C语言允许声明常量,常量的样子和变量完全一样,只是它们的值无法修改。使用const关键词来声明常量:

//Write what the fuck you wanna from the following two types:
int const a; 
const int a;

这两种写法都能正确声明一个int型的a常量,你当然可以声明float、char等类型的变量。

常量的初始化

由于a是一个常量,因此在声明之后,你无法为它赋值。所以上面的语句其实有一点问题,我们需要在声明的时候就给它赋值:

int const pi = 3.14;

这是一种初始化常量的办法。除此之外,在函数中声明的形参会在函数被调用的时候得到实参的值。

涉及指针的常量

当涉及指针的时候,有趣的事情来了,因为两样东西都可能成为常量——指针变量,以及它所指向的实体。分为以下三种情况:

int *p;  //p是一个普通的指向int型的指针

int const *p2;  //p2则是一个指向int型常量的指针

int *const p3;  //p3是一个指向int型的常量指针

int const *const p4;  //p4是一个指向int型常量的常量指针

用以上p2、p3、p4为例:

  • p2:你可以修改指针的值,但你不能修改它指向的值。即
    • 允许p2 = &a;
    • 不允许**p2 = a*;
  • p3:你可以修改指针指向的值,但不能修改指针的值;
    • 允许**p3 = a*;
    • 不允许p3 = &a;
  • p4:你既不能修改指针的值,也不能修改指针指向的值。
    • 既不允许p4 = &a;
    • 也不允许**p4 = a*;

const与#define

#define是另一种创建名字常量的机制。例如:

#define MAX_ELEMENTS 50

int const MAX_ELEMENTS_CONST = 50;

在这种情况下,使用#define比使用const变量更好,因为只要允许使用字面值常量的地方都可以使用前者,比如声明数组的长度;const变量只能用于允许使用变量的地方。

在C++中,可以用const值来声明数组长度,在C中不可以。

Reference:

  • Pointer on C
  • C++ primer plus
C语言的常量与指针问题
Share this

Subscribe to Zed's Blog