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关键词修饰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";
第六行语句,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';
这样可以通过编译吗?
pStr经过加减运算后,仍然为const char *类型。所指向的内容依然无法更改。