4.
const限定符和指针结合起来常见的情况有以下几种。
const int *a;
int const *a;
这两种写法是一样的,a是一个指向const int型的指针,a所指向的内存单元不可改写,所以(*a)++是不允许的,但a可以改写,所以a++是允许的。
int * const a;
a是一个指向int型的const指针,*a是可以改写的,但a不允许改写。
int const * const a;
a是一个指向const int型的const指针,因此*a和a都不允许改写。
指向非const变量的指针或者非const变量的地址可以传给指向const变量的指针,编译器可以做隐式类型转换,例如:
char c = 'a';
const char *pc = &c;
但是,指向const变量的指针或者const变量的地址不可以传给指向非const变量的指针,以免透过后者意外改写了前者所指向的内存单元,例如对下面的代码编译器会报警告:
const char c = 'a';
char *pc = &c;
即使不用const限定符也能写出功能正确的程序,但良好的编程习惯应该尽可能多地使用const,因为:
1.
2.
3.
在第
const char *p = "abcd";
const char str1[5] = "abcd";
char str2[5] = "abcd";
printf(p);
printf(str1);
printf(str2);
printf("abcd");
注意上面第一行,如果要定义一个指针指向字符串字面值,这个指针应该是const char *型,如果写成char *p = "abcd";就不好了,有隐患,例如:
int main(void)
{
...
...
}
p指向.rodata段,不允许改写,但编译器不会报错,在运行时会出现段错误。