9-2. const关键词

  • 学习人数 30K+
  • 适合所有人群学习
avatar
林耿亮

你好编程主讲老师

1. const修饰数组元素

char str[20] = "hello\n";
printf("%s", str);
str[0] = 'H';
printf("%s", str);

首元素被修改

代码中,我们声明了一个20个元素的字符数组str,并且用字符串"hello\n"来初始化它。使用printf打印它,结果为hello,首字母小写。

其后,我们将首元素从小写的'h'改为大写的'H'。再次使用printf打印它,结果为Hello,首字母大写。

首元素字符从小写字符改为了大写字符

那么,如果我们想禁止数组str的元素被修改,应该怎样做呢?

在原来的代码char str[20] = "hello\n"的前面加const关键词。

//  char左边增加const关键词
const char str[20] = "hello\n";

const关键词

当使用const关键词修饰char,将禁止修改char。

数组str的元素char无法被修改,其后的语句如果尝试修改数组元素则编译报错。

注意const关键词是可以加在char旁边的,也就是无论加在左边还是右边,均有这个效果。 下面两种写法是等效的。

//  char右边增加const关键词
const char str[20] = "hello\n";
//  char右边增加const关键词
char const str[20] = "hello\n";

const修饰char后,这种限制对数组中每一个char元素都有效。仅仅能读取,而不能修改。

数组每一个元素都无法被修改

2. const修饰指针所指向的数据

让我们回到上一节中修改字符常量而导致程序运行报错的例子。

#include <stdio.h>
int main() 
{
    char *pStr = "hello\n";
    printf("%s", pStr);
    pStr[0] = 'H';
    printf("%s", pStr);
    return 0; 
}

上一节中,我们写出这样的代码。代码中,通过指针pStr修改了字符串常量"hello\n"。但是,我们直到运行时才发现错误。怎样能够在编译时就发现错误呢?

我们可以使用const关键词修饰指针所指向的char。这样,一旦尝试修改指针所指向的char时,编译器会报错。

在C++中,语法强制要求指向字符串字面常量的指针为const char *,以避免修改常量而造成错误。若在Visual Studio中使用.cpp作为源文件后缀名,代码中char *指向字符串字面常量将无法通过编译。

//  char左边增加const关键词
const char *pStr = "hello\n";

const修饰char p

第六行语句,pStr[0] = 'H'尝试修改指针所指向的char内容。但是,在之前的声明中,char被关键词const修饰。这个修改是被禁止的,编译时会报错。

当然,将const关键词放置在char右边,也能起到同样的效果。

//  char右边增加const关键词
char const *pStr = "hello\n";

既然pStr所指向的char无法被修改。那么,我们尝试修改pStr偏移后所指向的char呢?

例如:

pStr[1] = 'E';
pStr[2] = 'l';
pStr[3] = 'l';
pStr[4] = 'O';

这样可以通过编译吗?

const修饰的指针偏移后仍然无法修改

pStr经过加减运算后,仍然为const char *类型。所指向的内容依然无法更改