C语言的那些事

/** 引用自同学杜川的分享 **/

 详细内容可参考杜川当时的ppthttps://files.cnblogs.com/L-aho/C%E8%AF%AD%E8%A8%80%E9%82%A3%E4%BA%9B%E4%BA%8B.pdf

一些关键字解析

定义与声明
Register
Static
Sizeof
Signed/unsigned
Const
Struct
union

关键字------从定义和声明说起

何为定义,何为声明?
定义:编译器创建一个对象,为对象分配内存并给它去一个名字。名字和内存相绑定,内存位置也不能被改变。
声明:告诉编译器名字已经匹配到一块内存上了。以后用到这个名字都是在别处已经定义得。
两者区别:定义分配了内存,声明没有分配内存。
两者联系:定义一定是声明,声明不一定是定义。

作用域

变量在被声明时,它只在程序的一定区域才能被访问。这个区域由变量的作用域决定。

编译器可以确定的作用域类型:

文件作用域
函数作用域
代码块作用域
原型作用域

原型作用域:只适用于函数原型中声明的参数名。
不必与函数定义中参数名一致,也不必与函数实际调用时实参匹配。

 

链接属性

标识符的连接属性决定如何处理不同文件中出现的标识。
external, internal, none。
none: 标示符的多个声明被当做是多个独立不同的个体。
Internal: 在同一个源文件的所有声明当做是同一个实体,但是不同原文件的多个生命则属于不同的实体。
External: 无论声明多少次,都属于同一个实体。

默认全局变量和函数的链接属性是external, 局部变量的链接属性是none。
没有标识符的默认链接属性是internal。

Static关键字把标识符的链接属性改为internal。
Extern关键字把标识符的链接属性改为external。

存储类型

 

变量的缺省存储类型取决于声明位置。
  静态变量: static
  自动变量: auto
  寄存器变量: register
Static可以改变一个变量的存储类型为静态变量。

请求编译器尽可能将变量存在CPU内部的寄存器中。
是请求,而不是绝对的定义(有可能失败)。
Register类型的变量类型受到CPU寄存器类型的限制。
Register类型的变量可能并不存在于内存中,所以不能用“&”取其地址。

 

关键字-----STATIC

Static关键字的用处比较复杂,也容易混淆。
涉及一个标识符的链接属性和存储属性。
对于一个链接属性为external的标识符,static关键字将其链接属性变为internal。
对于一个链接属性为none的标识符,static关键字将其存储属性变为静态变量。

对于一个链接属性为external的标识符,static关键字将其链接属性变为internal。此时不改变标识符的存储属性。

对于一个链接属性为none的标识符,static关键字将其存储属性变为静态变量。此时不改变标识符的链接属性。

关键字-----SIZEOF(一下结果都是针对32位机器)

Sizeof 是关键字,不是函数。
int i;
sizeof(int) = ? 4
sizeof(i) = ? 4
sizeof int = ? error
sizeof i = ? 4

int a[100];
sizeof(a) = ? 400
sizeof(a[1]) = ? 4
sizeof(&a) = ? 4
sizeof(&a[0]) = ? 4
void fun(int b[100])
{
sizeof(b) // sizeof(b) = ? 4
}

关键字-----SIGNED, UNSIGNED

Unsigned/singed关键字决定了计算机如何看待符号位。
整数的补码表示:
Unsigned:


Signed:

Signed 和 unsigned 对符号位不同的处理导致同一数据用signed 和 unsigned 类型处理会出现问题。

 

答案为255

关键字---CONST

Const 关键字修饰指针的时候容易产生迷惑。
  Const int *p;
  Int const *p;
  Int *const p;
  Const int* p;

(编译器在看谁是const时,去掉了类型,比如const int * p =》 const *p,即*p不能动 )

Const 修饰typedef定义得类型,更容易产生迷惑。
  Typdefe int* int_ptr;
  Int_ptr const a;
  const int_ptr a;

(同样,去掉int_ptr,就是const a, a这个指针不能动)

关键字-----STRUCT与系统对齐。

结果为16,向最长类型对齐

 

 

posted on 2012-06-18 13:21  aho  阅读(409)  评论(0编辑  收藏  举报

导航