文章

C语言中的const

定义

const 将修饰离它最近的对象(优先左边)

解释

Bjarne 在他的《The C++ Programming Language》里面给出过一个助记的方法

1
“以 * 分界,把一个声明从右向左读”。

注意语法,* 读作 pointer to (指向…的指针),const (常量) 是形容词,char (变量类型) 和 p (变量名) 当然都是名词。

  • const char * p 读作:p is a pointer to a const char,译:p 是一个指针(变量),它指向一个常量字符(const char)。就是 p 能修改,p 指向内容不能修改

  • char * const p 读作:p is a const pointer to a char,译:p 是一个常量指针(const p),它指向一个字符(变量)。就是 p 不能修改,p 指向内容能修改

其他情况

另外请再注意下面的情况:

  • 先看 const int aint const a,这里没有分界符 *,虽然 const 的位置不同,但意思不变,它 const 修饰的是 int,常量整数。

  • 再看 const char * pchar const * p,首先以 * 分界,虽然 const 的位置改变了,但它都是在修饰 char,常量字符。

  • const char * const p 就表示常量指针指向的常量字符

扩展

const char a[]const char *aconst char *a[3]

  • const char a[]中的 a 表示 a 一个字符数组,是个数组类型的变量,大小和数组占用空间相同。a 不可修改,也就是内容不可修改
  • const char *a中的 a 表示指向字符的指针(对于字符数组就是指向数组第一个字符的指针),大小就是一个指针。指针可以修改,指针指向的内容不可修改
  • const char *a[3]中的 a 表示一个指针数组,数组包含 3 个指针,这些指针都指向字符,大小是 3 个指针大小。对于每个指针,该指针为非const,可修改,但其指向的内容为const,不可修改(相当于const char *a
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include <stdio.h>
int main()
{

        const char a[] = "abcdefghijkl";
        const char *b = "ijklmnopqrst";
        const char *c[3];

        printf("sizeof(a) = %d\n",(int)sizeof(a));
        // sizeof(a) = 13
        printf("sizeof(b) = %d\n",(int)sizeof(b));
        // sizeof(b) = 8
        printf("sizeof(c) = %d\n",(int)sizeof(c));
        // sizeof(c) = 24
        printf("c[0]:%p,c[1]:%p,c[2]:%p\n",c[0],c[1],c[2]);
        // c[0]:(nil),c[1]:(nil),c[2]:(nil)
        return 0;
}

参考

本文由作者按照 CC BY 4.0 进行授权

© Kai. 保留部分权利。

浙ICP备20006745号-2,本站由 Jekyll 生成,采用 Chirpy 主题。