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;
}
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;
}
相关文章推荐
- c++关键字之#define typedef const
- C/C++中const关键字详解
- c语言中static、external、const关键字理解
- const 关键字使用总结
- 总结static和const关键字的作用
- iOS 开发中的关键字const/static/extern
- C#中readonly关键字与const关键字的区别(转)
- const 关键字
- 关键字:auto、static、register、const、volatile 、extern 总结
- C/C++关键字static,const,inline,define,typedef
- C/C++中const关键字详解
- 对const关键字的理解 时间:2017-01-05作者:华清远见
- C#基础知识系列八(const和readonly关键字)
- C#基础知识系列八(const和readonly关键字)
- C++中static,const,mutable关键字
- C++ Special:const关键字和常量指针 vs 指针常量
- 关键字static/const的作用
- const 关键字提高代码健壮性
- const关键字总结
- C语言深度剖析--读书笔记7_const关键字