const

4. 指针与const限定符 

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指针,因此*aa都不允许改写。

指向非const变量的指针或者非const变量的地址可以传给指向const变量的指针,编译器可以做隐式类型转换,例如:

char c = 'a';
const char *pc = &c;

但是,指向const变量的指针或者const变量的地址不可以传给指向非const变量的指针,以免透过后者意外改写了前者所指向的内存单元,例如对下面的代码编译器会报警告:

const char c = 'a';
char *pc = &c;

即使不用const限定符也能写出功能正确的程序,但良好的编程习惯应该尽可能多地使用const,因为:

  1. const给读代码的人传达非常有用的信息。比如一个函数的参数是const char *,你在调用这个函数时就可以放心地传给它char *const char *指针,而不必担心指针所指的内存单元被改写。

  2. 尽可能多地使用const限定符,把不该变的都声明成只读,这样可以依靠编译器检查程序中的Bug,防止意外改写数据。

  3. const对编译器优化是一个有用的提示,编译器也许会把const变量优化成常量。

  4. 字符串字面值通常分配在.rodata

  5. 字符串字面值类似于数组名,做右值使用时自动转换成指向首元素的指针,这种指针应该是const char *型。我们知道printf函数原型的第一个参数是const char *型,可以把char *const char *指针传给它,所以下面这些调用都是合法的:

    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)
    {
    	char *p = "abcd";
    ...
    	*p = 'A';
    ...
    }

    p指向.rodata段,不允许改写,但编译器不会报错,在运行时会出现段错误。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值