- 1、本文档共9页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
C语言之const用法
C语言之const 与static详解
看 到const关键字,很多人想到的可能是const常量,其实关键字const并不能把变量变成常量!在一个符号前加上const限定符只是表示这个符号 不能被赋值。也就是它的值对于这个符号来说是只读的,但它并不能防止通过程序的内部(甚至是外部)的方法来修改这个值(C专家编程.p21)。也就是说 const变量是只读变量,既然是变量那么就可以取得其地址,然后修改其值。看来const也是防君子不防小人啊!:)const 使用情况分类详析1、const的普通用法const int n = 10;意思很明显,n是一个只读变量,程序不可以直接修改其值。这里还有一个问题需要注意,即如下使用:int a[n];在ANSI C中,这种写法是错误的,因为数组的大小应该是个常量,而n只是一个变量。2、const用于指针const int *p;int const *p;int * const p;在最后的一种情况下,指针是只读的(即p只读),而在另外两种情况下,指针所指向的对象是只读的(即*p只读)。const 是一个左结合的类型修饰符,它与其左侧的类型修饰符一起为一个类型修饰符,所以,int const 限定 *p,不限定p。int *const 限定p,不限定*p。这里有一个简便的区分方法:沿着*号划一条线,如果const位于*的左侧,则const就是用来修饰指针所指向的变量,即指针指向为常量;如果const位于*的右侧,const就是修饰指针本身,即指针本身是常量。3、const用于函数的地址传递参数void foo(const int *p)这种形式通常用于在数组形式的参数中模拟传值调用。也就是相当于函数调用者声称:我给你一个指向它的指针,但你不能去修改它。如果函数编写者遵循了这个约定,那么就相当于模拟了值传递。这也是const最有用之处了:用来限定函数的形参,这样该函数将不会修改实参指针所指的数据。这里注意了,是函数不应该去修改而不是不能修改,也就是说const不能阻止参数的修改(原因见上)。4、const用于限定函数的返回值const int foo();const struct mytype foo();上述写法限定函数的返回值不可被更新,当函数返回内部的类型时,已经是一个数值,当然不可被赋值更新,所以,此时const无意义,最好去掉,以免困惑。当函数返回自定义的类型时,这个类型仍然包含可以被赋值的变量成员,所以,此时有意义。一、宏定义:主要是一些语法问题和技巧
例如:
#define FIND(s,e) (size_t)(((struct s*)(0))-e)//求结构体内的变量相对于结构体的偏移量
#define SECONDS_PER_YEAR (360*24*60*60)UL//求一年中的秒数
#define MIN(a,b) (((a)=(b))?(a):(b))//求最小值
说明:尽可能考虑移植性,由于代码可能在16位机,也有可能在32位机器上运行,所以采用size_t和UL都是基于移植性的考虑。
二、const用法:定义常量,修饰指针、函数的输入参数和返回值,简单说const表示只读的意思,本质上来说它只是在全局数据段或者栈中定义的是一个 只读的常量,不是真正位于字符串常量区。Const的目的是为了产生高质量的代码,提高代码的可读性,同时保护好不能被任意改变的内存,从而降低Bug产 生的概率。
??? const int a = 10;
const int b;//错误,常量必须初始化
??? int a = 10,b = 9;
??? const int *p1 = a;//指针指向的内容只读,不能通过该指针去写
??? *p1 = 11;//错误
??? int * const p2 = a;//指针本身只读,指针初始化到一个对象后,将不能被修改
p2 = b;//错误
const int *p3 const = a;//指针本身和指向的内容都是只读
?
const char *fp1(void) //修饰返回值,表示返回的指针指向内容只读
{
??? char *p = dddd;
??? return p;
}
void fp1(const char *str)
{
??? *str = 4; //错误
??? const char *p = str;//p必须为const,才能接受str
}
int _tmain(int argc, _TCHAR* argv[])
{
??? const char *d = fp1();
??? printf(%s,d);
}
?
三、extern用法:在别的文件中定义的变量,要想在
您可能关注的文档
- 管理心理学历年考题.doc
- 消费行为1-17.docx
- 2016华师在线心理学在线作业.doc
- 文化理论和大众文化导论脉络笔记.docx
- 广告心理学重点(下).doc
- 厦门大学网络教育 人力资源管理 在线练习题答案.docx
- 全国自学考试管理心理学2005年1月份试题.doc
- 08.10(全.doc
- 心理学习题及思考题(含答案).doc
- 交大网院组织行为学考试复习提纲.doc
- 2024年度宁波事业单位专业技术岗位聘用合同3篇.docx
- 2024年离婚案件双方心理辅导合同.docx
- 2025年江苏医药职业学院单招职业技能考试题库及答案一套.docx
- 2024年度绿色幼儿园建筑工程施工总承包合同3篇.docx
- 二零二五年度2吨不锈钢电子地磅秤带打印功能研发合作协议.docx
- 2025年广西生态工程职业技术学院单招职业技能测试题库带答案.docx
- 2024年度预拌砂浆产业链上下游合作框架协议3篇.docx
- 2024年度版权许可使用协议(实用新型).docx
- 2025年海口经济学院单招综合素质考试题库新版.docx
- 2024年度办公楼地板翻新与升级改造合同范本3篇.docx
文档评论(0)