2015-1-6 const和指针

来源:互联网 发布:代做淘宝店 编辑:程序博客网 时间:2024/06/05 15:12

首先来定义两个数组作为说明的例子。

int a[10]={0};const int b[10]={0};

一、对于Int a[10]={0}看下面几个指针初始化的代码:

int *error_p;//1*error_p=4;int *p=a;//2const int* p1=a;//3int const* p2=a;//4
<span style="white-space: pre;"></span>int* const p3=a;//5
const int* const p_cannotchange=a;//6
对于上面6个指针,一一说明:

1.错误!因为error_p没有经过初始化被分配空间,就指向了一个常量。虽然编译会通过,但是运行就会警告error_p未初始化!这样的行为不可控,是很危险的

2.常规的指针初始化,p指向a数组,没什么好说的

3.p1是const int*类型,指针指向的数据类型(*p1)为const int。

p1指向a数组很好理解,前缀const代表不允许通过指针p1来该表a[ ]中的值!就好比对于指针指向的元素加了一个读写保护。但是我们依然可以通过p1++、p1+2等操作来访问a[ ]中的元素。

4.暂时没发现和3有什么区别。

5.p2是int* 型,指针指向的数据类型(*p2)为int。

其值被限定为const,虽然p2指向a[ ],但是其值本身被限定为不可改变。也就是说无法通过p2++等操作改变所指对象!形象的说就是指针自己被保护起来

6.有了上面的基础,很好理解,指针本身被保护无法改变,同时指针指向的元素也被保护无法通过指针来操作。我们能做的仅有访问。


==============================================================

二、对于const int b[10]={0}看下面代码

const int *q2=const_a;//1.合法const int const *q2=const_a;//2.合法int *q1=const_a;//3.非法!int* const q2=const_a;//4.非法!
以上4条语句比较好理解,只要遵循指针和所指对象的数据类型一致!即可理解错误在哪里。

const int 型的数组b[ ]必须由const int 类型的指针来指,就如同定义一个结构体struct,必须用struct*来指一样。



以上就是const和指针的一点总结。

0 0