C语言--const和指针
2017-07-23 19:51
288 查看
const数组、const指针和指向const的指针。
如果程序稍后尝试改变数组元素的值,编译器将生成一个编译期错误消息:
第2行代码把pd指向的double类型的值声明为const,这表明不能使用pd来更改它所指向的值:
无论是使用指针表示法还是数组表示法,都不允许使用pd修改它所指向数据的值。但是要注意,因为rates并未被声明为const,所以仍然可以通过rates修改元素的值。另外,可以让pd指向别处:
指向 const 的指针通常用于函数形参中,表明该函数不会使用指针改变数据。例如:
关于指针赋值和const需要注意一些规则。
首先,把const数据或非const数据的地址初始化为指向const的指针或为其赋值是合法的:
然而,只能把非const数据的地址赋给普通指针:
这个规则非常合理。否则,通过指针就能改变const数组中的数据。
可以用这种指针修改它所指向的值,但是它只能指向初始化时设置的地址。
const数组
#define MONTHS 12 ... const int days[MONTHS] = {31,28,31,30,31,30,31,31,30,31,30,31};
如果程序稍后尝试改变数组元素的值,编译器将生成一个编译期错误消息:
days[9] = 44; /* 编译错误 */
指向const的指针
指向const的指针不能用于改变值。考虑下面的代码:double rates[5] = {88.99, 100.12, 59.45, 183.11, 340.5}; const double * pd = rates; // pd指向数组的首元素
第2行代码把pd指向的double类型的值声明为const,这表明不能使用pd来更改它所指向的值:
*pd = 29.89; // 不允许 pd[2] = 222.22; //不允许 rates[0] = 99.99; // 允许,因为rates未被const限定
无论是使用指针表示法还是数组表示法,都不允许使用pd修改它所指向数据的值。但是要注意,因为rates并未被声明为const,所以仍然可以通过rates修改元素的值。另外,可以让pd指向别处:
pd++; /* 让pd指向rates[1] -- 没问题 */
指向 const 的指针通常用于函数形参中,表明该函数不会使用指针改变数据。例如:
void show_array(const double *ar, int n);
关于指针赋值和const需要注意一些规则。
首先,把const数据或非const数据的地址初始化为指向const的指针或为其赋值是合法的:
double rates[5] = {88.99, 100.12, 59.45, 183.11, 340.5}; const double locked[4] = {0.08, 0.075, 0.0725, 0.07}; const double * pc = rates; // 有效 pc = locked; //有效 pc = &rates[3]; //有效
然而,只能把非const数据的地址赋给普通指针:
double rates[5] = {88.99, 100.12, 59.45, 183.11, 340.5}; const double locked[4] = {0.08, 0.075, 0.0725, 0.07}; double * pnc = rates; // 有效 pnc = locked; // 无效 pnc = &rates[3]; // 有效
这个规则非常合理。否则,通过指针就能改变const数组中的数据。
const指针
const还有其他的用法。例如,可以声明并初始化一个不能指向别处的指针,关键是const的位置:double rates[5] = {88.99, 100.12, 59.45, 183.11, 340.5}; double * const pc = rates; // pc指向数组的开始 pc = &rates[2]; // 不允许,因为该指针不能指向别处 *pc = 92.99; // 没问题 -- 更改rates[0]的值
可以用这种指针修改它所指向的值,但是它只能指向初始化时设置的地址。
两次const
最后,在创建指针时还可以使用const两次,该指针既不能更改它所指向的地址,也不能修改指向地址上的值:double rates[5] = {88.99, 100.12, 59.45, 183.11, 340.5}; const double * const pc = rates; pc = &rates[2]; //不允许 *pc = 92.99; //不允许
相关文章推荐
- c语言:对于一个变量n,const用法和指针的比较
- C语言拾遗:常量指针与指针常量(const int *ptr, int const *ptr, int * const ptr, const int * const ptr区别)
- c语言---const搭配指针问题
- C语言const与指针——为什么不能用char **给const char **赋值
- C语言的const关键字与指针搭配使用
- C语言 const与指针
- C语言里的const和指针修饰关系
- C语言中const与指针的指针
- c语言的指针、数组和常量修饰符const
- C语言中关于const与指针结合的理解
- C语言const与指针
- C语言回顾(七、多重指针,argc,argv,动态内存分配,void指针,const)——iOS开发基础
- C语言学习9: malloc动态内存存储,动态内存分配去空格字符增长版,动态内存分配去符号incr增长版,型参和返回值都是int型的函数的指针,main函数的地址也可以用指针指向,typedef定义函数指针,函数定义与嵌套的作用,返回函数指针类型,const作用
- const和指针(C语言)
- C语言的const关键字与指针搭配使用
- C语言的const和指针
- C语言的const关键字与指针搭配使用
- c语言:对于一个变量n,const用法和指针的比较
- c语言中const 类型变量地址赋值给指针。
- C语言之const与指针