您的位置:首页 > 其它

const关键字

2013-06-17 22:16 127 查看
const int a = 5;

int *p = &a;

*p = 10;

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

输出a = 10(值被改变) //但是 a=10 直接赋值不能通过编译

const int a 全局的不能改(能通过编译,但不能运行), 局部的在栈上,可以修改。

const int n = 5;

int a
;

这个问题讨论的是“常量”与“只读变量”的区别。常量,例如5,
"abc",等,肯定是只读的,因为常量是被编译器放在内存中的只读区域,当然也就不能够去修改它。而“只读变量”则是在内存中开辟一个地方来存放它的值,只不过这个值由编译器限定不允许被修改。C语言关键字const就是用来限定一个变量不允许被改变的修饰符(Qualifier)。上述代码中变量n被修饰为只读变量,可惜再怎么修饰也不是常量。而ANSI
C规定数组定义时长度必须是“常量”,“只读变量”也是不可以的,“常量”不等于“不可变的变量”。但是在C99中,局部数组是可以使用变量作为其长度的

在ANSI C中用什么来定义常量呢?答案是enum类型和#define宏,这两个都可以用来定义常量

typedef char * pStr;

char string[4] = "bbc";

const char *p1 = string; //1式

const pStr p2 = string; //2式

p1++;

p2++;

答案与分析:

问题出在p2++上。

1)const使用的基本形式: const type m; 限定m不可变(j记住,比"左数右指"好用)。

2)替换基本形式中的m为1式中的*p1,替换后const char *p1; 限定*p1不可变,当然p1是可变的,因此问题中p1++是对的。

3)替换基本形式中的type为2式中的pStr,替换后const pStr m;限定m不可变,题中的pStr就是一种新类型,因此问题中p2不可变,p2++是错误的

const只修饰其后的变量,至于const放在类型前还是类型后并没有区别。如:const int a和int const a都是修饰a为const。*不是一种类型,如果*pType之前是某类型,那么pType是指向该类型的指针

一个简单的判断方法:指针运算符*,是从右到左,那么如:char const * pContent,可以理解为char const (* pContent),即* pContent为const,而pContent则是可变的。

#include <stdio.h>

#include <stdlib.h>

const int i = 10; //文本常量区

int j = 10; //初始化全局区

int n; // 未初始化全局区

char *p = "test"; // "test"在文本常量区,指针自身在初始化全局区

int main()

{

char *p1 = "Hello"; // "Hello"在文本常量区,指针自身在栈里

const int m = 10; // m在栈里

printf("二进制文件区域:%0x \n", main);

printf("文本常量区:%0x %0x %0x \n", &i, p, p1);

printf("初始化全局区:%0x %0x \n", &j, &p);

printf("未初始化全局区:%0x \n", &n);

printf("栈:%0x %0x \n", &p1, &m);

return 0;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: