const关键字

来源:互联网 发布:js image onload 编辑:程序博客网 时间:2024/06/11 02:55
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[n];
这个问题讨论的是常量”与“只读变量”的区别。常量,例如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;
}

原创粉丝点击