Chinaunix首页 | 论坛 | 博客

CR7

  • 博客访问: 13811
  • 博文数量: 4
  • 博客积分: 1470
  • 博客等级: 上尉
  • 技术积分: 50
  • 用 户 组: 普通用户
  • 注册时间: 2010-10-05 11:18
文章分类
文章存档

2010年(4)

我的朋友
最近访客

分类: LINUX

2010-10-06 13:22:48

一、const修饰符

Const修饰符在C语言中是一个比较新的描述符,意即其所修饰的对象为只读。

说明:

1、必须初始化

const int i=5;  //合法

const int j;  //非法,导致编译错误

{const int j;j=5;} //非法

2、可以通过函数进行初始化

int value();

const int i=value();

3、限定符声明变量只能被读,即其值不可以修改

const int i=5;

int j=0; 

i=j;  //非法,导致编译错误

J=i;  //合法

4、可以在另一个连接文件中引用const常量

extern const int i;  //合法

extern const int j=10; //非法,常量不可以被再次赋值

5、数值常量和指针常量

const int p1  //p1是常量,p1的值不能被修改

const int *p2  //指针p2所指的内容是常量,不能被修改,当p的指向可以被修改。

Const int * const p3 //指针p3是常量,所指内容也是常量

情景一:最简单的const用法

#include

int main()

{

int const a;

a=5;

printf("a=%d\n",a);

return 0;

}

如果编译这个c文件,就会报错:

1071.c: In function ‘main’:
1071.c:5: error: assignment of read-only variable ‘a’

显而易见,这是const在搞鬼,因为声明了const的变量是不能修改的!

如果将源代码修改为如下这样,就没有问题了!

#include

int main()

{

int const a=5;

printf("a=%d\n",a);

return 0;

}

总结:const声明的变量必须要进行初始化赋值,如果错过这个机会,以后再想给const的变量赋值,可就没门了!切记~

PSint constconst int是一回事,颠倒写都是可以的。以后遇到了别犯晕,呵呵。但是,还是要留个心眼,当const和指针搀和到一起时,这个颠倒写的规律可未必成立。

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

情景二:发明const为了什么?

const诞生之前,开发者一直使用#define VAR 100来定义一些有特殊用途的类常量,不过这样定义是存在一些劣势的。因此const应运而生,之后开发者可以使用const int VAR=100;来定义类常量了。

至于为什么#define有其劣势,还要读者自己去google下。:)

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

情景三:const和指针的配合是噩梦!

你能分辨得清这些声明么:

const int *A;

int const *A;

int *const A;

const int *const A;

如果有点犯晕的话,那就先给出它们的讲解,然后继续看后面的情景分析吧。

const int *A; //修饰指向的对象,A可变,A指向的对象不可变
int const *A;
   //修饰指向的对象,A可变,A指向的对象不可变
int *const A;
   //修饰指针A A不可变,A指向的对象可变
const int *const A; //
指针AA指向的对象都不可变

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

情景四:const int *A

[rocrocket@wupengchong const_test]$ cat test1.c

#include

int main()

{

int num=12;

const int *A=#

printf("result=%d\n",*A);

return 0;

}

编译执行结果为:

[rocrocket@wupengchong const_test]$ cc test1.c
[rocrocket@wupengchong const_test]$ ./a.out
result=12

接下来,我们动动手脚,在代码中加入了(*A)++;这条语句:

[rocrocket@wupengchong const_test]$ cat test1.c

#include

int main()

{

int num=12;

const int *A=#

(*A)++;

printf("result=%d\n",*A);

return 0;

}

编译这个c文件:

[rocrocket@wupengchong const_test]$ !cc
cc test1.c
test1.c: In function ‘main’:
test1.c:6: error: increment of read-only location ‘*A’
可以看到,报错了,报错的内容表示”*A”是只读的,不能修改。

我们再修改一下源代码为下面这样:

[rocrocket@wupengchong const_test]$ cat test1.c

#include

int main()

{

int num=12;

int tmp=100;

const int *A=#

A=&tmp;

printf("result=%d\n",*A);

return 0;

}

编译执行结果为:

[rocrocket@wupengchong const_test]$ !cc
cc test1.c
[rocrocket@wupengchong const_test]$ ./a.out
result=100

好了,如果你仔细看了这几个小得不能再小的程序,你自己都可以给出结论了!

结论:如果声明了const int *A,那么A值是可以修改的,而*A是不可以修改的。更通俗的说,A指针可以随便指向一个整型,但只要被A盯上了的整型变量在使用*A引用时就不能修改了。

[rocrocket@wupengchong const_test]$ cat test1.c

#include

int main()

{

int num=12;

int tmp=100;

const int *A=#

A=&tmp;

tmp=3;

printf("result=%d\n",*A);

return 0;

}

编译执行的结果为:

[rocrocket@wupengchong const_test]$ !cc
cc test1.c
[rocrocket@wupengchong const_test]$ ./a.out
result=3

结论2:即使A指向了tmp,我虽然不能修改*A,但是我仍然是可以用tmp来修改这个值的,完全不管*A的存在。呵呵

注意 kkkkkkkkkkkk'

只是*A不能修改!一定要灵活应用!

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

情景五:int *const A

[rocrocket@wupengchong const_test]$ cat test1.c

#include

int main()

{

int num=12;

int *const A=#

printf("result=%d\n",*A);

return 0;

}

编译执行结果为:

[rocrocket@wupengchong const_test]$ !cc
cc test1.c
[rocrocket@wupengchong const_test]$ ./a.out
result=12

我们稍微修改下源代码:

[rocrocket@wupengchong const_test]$ cat test1.c

#include

int main()

{

int num=12;

int tmp=100;

int *const A=#

A=&tmp;

printf("result=%d\n",*A);

return 0;

}

编译时报错了:

[rocrocket@wupengchong const_test]$ !cc
cc test1.c
test1.c: In function ‘main’:
test1.c:7: error: assignment of read-only variable ‘A’
[rocrocket@wupengchong const_test]$ cat test1.c

可见A本身的值已经不能再变了。

继续修改源代码如下:

[rocrocket@wupengchong const_test]$ cat test1.c

#include

int main()

{

int num=12;

int *const A=#

(*A)=100;

printf("result=%d\n",*A);

return 0;

}

编译执行结果为:

[rocrocket@wupengchong const_test]$ !cc
cc test1.c
[rocrocket@wupengchong const_test]$ ./a.out
result=100

可以看出,(*A)是可以改变的。

结论又可以轻易推出了:int *const A;   //const修饰指针A A不可变,A指向的对象可变

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

情景六:const int *const A; //指针AA指向的对象都不可变

[rocrocket@wupengchong const_test]$ cat test1.c

#include

int main()

{

int num=12;

int const *const A=#

(*A)=100;

printf("result=%d\n",*A);

return 0;

}

编译会报错:

[rocrocket@wupengchong const_test]$ !cc
cc test1.c
test1.c: In function ‘main’:
test1.c:6: error: assignment of read-only location ‘*A’

改下源代码:

[rocrocket@wupengchong const_test]$ cat test1.c

#include

int main()

{

int num=12;

int tmp=100;

int const *const A=#

A=&tmp;

printf("result=%d

阅读(1268) | 评论(0) | 转发(0) |
0

上一篇:c 关键字 important (2)

下一篇:没有了

给主人留下些什么吧!~~