设为首页 加入收藏

TOP

C语言拾遗(一)
2014-03-10 13:05:05 来源: 作者: 【 】 浏览:325
Tags:语言 拾遗

  1. 没C++那么恶心的const

  C语言中的const修饰符用于修饰一个变量是const属性的。被C语言的const修饰的变量具有只读属性,并且不能被修改。

  const修饰的变量 != 常量,const修饰的变量虽然不能别修改,但是和常量还是有本质的区别的。

  在定义const类型的变量的时候,必须进行初始化,当然,在const作为函数的参数的时候,是不需要初始化的。

  1.1编译器对const变量的优化:

  编译器通常不为普通const 只读变量分配存储空间,而是将它们保存在符号表中,这使得它成为一个编译期间的值,没有了存储与读内存的操作,使得它的效率也很高。

  const 定义的只读变量从汇编的角度来看,只是给出了对应的内存地址,而不是象#define一样给出的是立即数,所以,const定义的只读变量在程序运行过程中只有一份拷贝(因为它是全局的只读变量,存放在静态区),而#define定义的宏常量在内存中有若干个拷贝。#define宏是在预编译阶段进行替换,而const修饰的只读变量是在编译的时候确定其值。#define宏没有类型,而const修饰的只读变量具有特定的类型。

  1.2当typedef碰到变量修饰符(const)

  typedef struct student

  {

  /*code*/

  }Stu_st,*Stu_pst;

  1)const Stu_pst stu3;

  2)Stu_pst const stu4;

  对于定义的stu3 和stu4,它们的类型一样吗?答案是一样的。为什么?

  在这里我们不能想当然的认为typedef和#define一样,直接进行展开。实际上,因为const修饰的都是变量自身,const对变量进行修饰的时候,不考虑类型,也就是说1)和2)中的typedef类型都被认为是一个类型,而不是被展开。所以上述就相当于是:

  const type var

  type const var

  也就是说,const修饰的是变量var.

  2. 不多见的volatile

  volatile 关键字和const 一样是一种类型修饰符,用它修饰的变量表示可以被某些编译器未知的因素更改,比如操作系统、硬件或者其它线程等。遇到这个关键字声明的变量,编译器对访问该变量的代码就不再进行优化,从而可以提供对特殊地址的稳定访问。

  3. 结构体

  3.1 柔性数组

  柔性数组又称为0长数组(zero-length arrays),这是C99加进去的一个特性。可以这样定义一个柔性数组:

  struct line {

  int length;

  char contents[];

  };

  struct line *thisline = (struct line *) malloc (sizeof (struct line) + this_length);

  thisline->length = this_length;

   

首页 上一页 1 2 3 下一页 尾页 1/3/3
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇数组和指针何时等同何时不同? 下一篇typedef 和 #define&nb..

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: