PHP程序员的C学习之路3 - 第二章, const关键字和常量
2014-03-25 14:52
274 查看
第二章, const关键字和常量
C语言中的常量跟用const关键字声明的变量比较容易混淆, 使用const关键字声明的变量严格来说不是常量, 只能说是只读变量而已.
一般使用const关键字声明一个只读变量可以使用以下的方式:
const type
varname;
或者
type const varname;
例如:
const int ivar;
或者
int const ivar;
const long lvar;
或者
long const lvar;
好了, 当我们声明以了个只读变量后, 试图去修改变量的值会有什么问题呢?
看看以下代码:
#include <stdio.h>
#include <stdlib.h>
int main()
{
const int ivar
= 10;
ivar = 12;
return 0;
}
然后我们编译这个程序, 出现以下错误:
可以从错误中看出, 我们不能修改一个只读变量.
但是为什么说只读变量不是常量呢? 我们上章说过常量, 常量是不能修改的, 如12,
'c'等这些是常量, 我们不能修改他们的值.
但是刚刚我们上面的程序也不能修改他们的值啊? 嗯, 真的不能修改吗? 再看看下面的程序:
#include <stdio.h>
#include <stdlib.h>
int main()
{
const int ivar
= 10;
int *ip;
printf("ivar:
%d\n", ivar);
ip = &ivar;
*ip = 12;
printf("ivar:
%d\n", ivar);
return 0;
}
输出:
嗯, 我们发现ivar的值已经被修改了, 所以只读变量不是真的只读, 可以同其他的路径去修改他的值.
另外再看一个只读变量跟常量的区别, 看代码:
#include <stdio.h>
#include <stdlib.h>
#define SIZE1
10
const int SIZE2
= 10;
int main()
{
int array1[SIZE1];
int array2[SIZE2];
return 0;
}
编译结果:
从编译结果中可以看到, 第9行出错了, 错误是数组array2不确定大小. 而使用常量就没有这种错误, 所以可以看出只读变量不是常量.
那么只读变量有什么用呢? 一般使用只读变量可以防止自己以外修改变量的值而造成错误. 另外只读变量不是常量, 而是变量, 我们可以通过其他的渠道去修改只读变量的值, 因为只读变量是在编译期间, 编译器做的处理, 主要看看你的代码有没有修改到只读变量的值. 所以只要隐式的修改只读变量的值, 编译器是不会发现的, 就像上面的程序一样.
===========================================================================
另外只读变量还有一些高级的用法, 因为现在还没有讲到指针, 所以以下内容可以等到讲完指针再回头看.
我们上面介绍了只读变量的声明方式了, 现在重温一下,
const type
varname;
或者
type const varname;
那么我们要声明一个int指针类型的只读变量怎么声明呢? 看下面的声明方式:
int * const iptr;//(1)
这次我们使用了第二种的声明方式, 如果使用第一种声明方式应该怎样呢? 按声明方式看应该是以下这样:
const int *iptr;//(2)
嗯, 这样正确吗? 答案是否定的, 因为*运算比const高级, 所以上面的声明等于下面的声明:
const int (*iptr);//(3)
本来我们想声明一个int *类型的只读变量, 现在却变成了声明一个int类型的指针只读变量. 明显不是我们想要的结果.
(1) 声明的iptr是不能修改的, 而(2)声明的是(*iptr)不能修改, 那么他们有什么区别?
(1)声明的iptr是指针, 而(2)声明的iptr也是指针, 但是是有区别的, 因为(1)声明的是iptr不能修改, 就是这个指针值不能修改, 而(2)声明的是iptr指向的值不能修改. 这样说可能有点难懂, 看代码:
#include <stdio.h>
#include <stdlib.h>
int main()
{
int * const iptr1;
const int *iptr2;
iptr1 = 100;
*iptr2 = 100;
return 0;
}
编译信息:
可以看出, 第8和第9行都出错了, 原因是修改了只读变量的值. 那我们现在修改一下程序:
#include <stdio.h>
#include <stdlib.h>
int main()
{
int * const iptr1;
const int *iptr2;
*iptr1 = 100;
iptr2 = 100;
return 0;
}
嗯, 编译通过了. 从而证实了iptr1和*iptr2不能修改, 但是*iptr1和iptr2可以修改.
但是如果我们想用const type
varname;这种形式来声明一个int *类型的只读变量应该怎么做呢? 我们可以使用下面的方式:
const (int *) iptr;
或者
tpyedef int * int_pointer_t;
const int_pointer_t
iptr;
还有最后一种情况, 如果我们想声明一个同时不能修改指针和指针指向的值的只读变量应该怎么声明呢? 很简单:
int const * const iptr;
或者
const int * const iptr;
为什么要这样声明, 看看上面的例子再研究就可以了.
下章讲的是函数, 请大家继续支持.
相关文章推荐
- php入门学习-----const&static&final关键字
- PHP程序员的C学习之路2 - 第一章, C语言的一些基础
- C++学习:const关键字和常量
- PHP常量深入学习 define和const的区别
- PHP定义常量时const关键字和define()函数的区别
- C#学习之路,学习笔记 2.6 变量的命名规则、常量 及 关键字
- php程序员学习javascript:第二章:javascript对象函数(一):字符串对象函数
- PHP程序员的C学习之路4 - 第三章, C语言的函数
- 黑马程序员 【】java学习之路——关键字、标识符、注释、常量和变量、数组
- php程序员学习javascript:第二章:javascript对象函数(二):数组对象函数
- PHP中const和define()定义常量的细节区别
- 【小白笔记】PHP学习之路 (25) --文件判断与操作
- C++学习笔记 C和C++中的const关键字
- 菜鸟入门:Java程序员学习之路
- php源码之路第二章第二节(SAPI概述之嵌入式)
- 【小白笔记】PHP学习之路 (14) --数组(4)
- 算法学习之路和程序员(技术)学习必读书籍
- PHP程序员突破成长瓶颈 - 附学习建议
- 游戏程序员的学习之路
- PHP程序员进阶学习书籍参考指南