为了方便考试复习,本人仅作搜集和整理处理,原文详见菜鸟教程。
1.4C的变量
变量的名称可以由字母、数字和下划线字符组成。它必须以字母或下划线开头
基本类型有:
char 通常是一个字节(八位)。这是一个整数类型。
int 对机器而言,整数的最自然的大小。
float 单精度浮点值。
double 双精度浮点值。
void 表示类型的缺失。
变量可以在声明的时候被初始化(指定一个初始值)。例如下面把d,f定义并初始化。
int d = 3, f = 5;
变量的声明有两种情况:
1、一种是需要建立存储空间的。例如:int a 在声明的时候就已经建立了存储空间。
2、另一种是不需要建立存储空间的,通过使用extern关键字声明变量名而不定义它。 例如:extern int a 其中变量 a 可以在别的文件中定义的。
除非有extern关键字,否则都是变量的定义。
如果需要在一个源文件中引用另外一个源文件中定义的变量,我们只需在引用的文件中将变量加上 extern 关键字的声明即可。
关于左值和右值
1、 当需要保存数据的时候,需要lvalues。
2、 当需要读取数据的时候,需要rvalues。
3、 rvalues 永远不能转换为 lvalues
看例子
int n;
int m;
m = n+2; // 这个表达式里 n 是 rvalues
变量的内存寻址(与系统有关)
(1)内存寻址由大到小,优先分配内存地址比较大的字节给变量,所以说变量越先定义,内存地址就越大。
(2)变量地址的获取方式:& 变量名。
(3)输出地址的方式:%p。
1.5C的常量
常量就像是常规的变量,只不过常量的值在定义后不能进行修改。
1.整数常量
整数常量可以是十进制、八进制或十六进制的常量。前缀指定基数:0x 或 0X 表示十六进制,0 表示八进制,不带前缀则默认表示十进制。
整数常量也可以带一个后缀,后缀是 U 和 L 的组合,U 表示无符号整数(unsigned),L 表示长整数(long)。后缀可以是大写,也可以是小写,U 和 L 的顺序任意。
例如:
85 /* 十进制 */
0213 /* 八进制 */
0x4b /* 十六进制 */
30 /* 整数 */
30u /* 无符号整数 */
30l /* 长整数 */
30ul /* 无符号长整数 */
2.浮点常量
浮点常量由整数部分、小数点、小数部分和指数部分组成。您可以使用小数形式或者指数形式来表示浮点常量。
当使用小数形式表示时,必须包含整数部分、小数部分,或同时包含两者。当使用指数形式表示时, 必须包含小数点、指数,或同时包含两者。带符号的指数是用 e 或 E 引入的。
例如
3.14159 /* 合法的 */ 314159E-5L /* 合法的 */
3.字符常量
字符常量是括在单引号中。可以是一个普通的字符(例如 ‘x’)、一个转义序列(例如 ‘\t’),或一个通用的字符(例如 ‘\u02C0’)。
带反斜杠的这些转义符有自己的功能。列出一部分常用的
转义序列 含义
\ \ 字符
’ ’ 字符
" " 字符
? ? 字符
\a 警报铃声
\b 退格键
\f 换页符
\n 换行符
\r 回车
\t 水平制表符
\v 垂直制表符
3.字符串常量
字符串字面值或常量是括在双引号 “” 中的。一个字符串包含类似于字符常量的字符:普通的字符、转义序列和通用的字符。空格做分隔符,把一个很长的字符串常量进行分行。
4.定义常量
在 C 中,有两种简单的定义常量的方式:
1使用 #define 预处理器。
2使用 const 关键字。
例如使用#define定义
#include <stdio.h>
#define LENGTH 10
#define WIDTH 5
#define NEWLINE '\n'
int main()
{
int area;
area = LENGTH * WIDTH;
printf("value of area : %d", area);
printf("%c", NEWLINE);
return 0;
}
使用const定义,注意观察两种方法的位置。
#include <stdio.h>
int main()
{
const int LENGTH = 10;
const int WIDTH = 5;
const char NEWLINE = '\n';
int area;
area = LENGTH * WIDTH;
printf("value of area : %d", area);
printf("%c", NEWLINE);
return 0;
}
实际上#define 是宏定义,它不能定义常量,但宏定义可以实现在字面意义上和其它定义常量相同的功能,本质的区别就在于 #define 不为宏名分配内存。
而 const 也不为常量分配内存,其实 const 并不是去定义一个常量,而是去改变一个变量的存储类,把该变量所占的内存变为只读!
关于四种进制说明:
在二进制中只有 0、1 两种情况,你不会看到比 1 大的数字。二进制是逢 2 就进位,所有数字中没可能有 2 或大于 2 的数字,
在八进制中有 0、1、2、3、4、5、6、7这八种情况,你也不会看到比7大的数字。八进制是逢8就进位,所有数字中没可能有8或大于8的数字。
在十进制中有0、1、2、3、4、5、6、7、8、9这十种情况,你更不会看到比9大的数字。十进制是逢10就进位,所有数字中有0~9都有
在十六进制中有 0、1、2、3、4、5、6、7、8、9、A、B、C、D、E、F,其中 A 表示 10;B 表示 11;C 表示 12;D 表示 13;E 表示 14;F 表示 15。十六进制数字中含有 A~F 字母。
1.6C 存储类
存储类定义 C 程序中变量/函数的范围(可见性)和生命周期。这些说明符放置在它们所修饰的类型之前。
1.auto 存储类
auto 存储类是所有局部变量默认的存储类。auto 只能用在函数内,即 auto 只能修饰局部变量。
2.register 存储类
register 存储类用于定义存储在寄存器中而不是 RAM 中的局部变量。这意味着变量的最大尺寸等于寄存器的大小(通常是一个词),且不能对它应用一元的 ‘&’ 运算符(因为它没有内存位置)。寄存器只用于需要快速访问的变量,比如计数器。
3.static 存储类
static 存储类指示编译器在程序的生命周期内保持局部变量的存在,而不需要在每次它进入和离开作用域时进行创建和销毁。因此,使用 static 修饰局部变量可以在函数调用之间保持局部变量的值。
static 修饰符也可以应用于全局变量。当 static 修饰全局变量时,会使变量的作用域限制在声明它的文件内。
全局声明的一个 static 变量或方法可以被任何函数或方法调用,只要这些方法出现在跟 static 变量或方法同一个文件中。
4.extern 存储类
extern 存储类用于提供一个全局变量的引用,全局变量对所有的程序文件都是可见的。当您使用 ‘extern’ 时,对于无法初始化的变量,会把变量名指向一个之前定义过的存储位置。
当您有多个文件且定义了一个可以在其他文件中使用的全局变量或函数时,可以在其他文件中使用 extern 来得到已定义的变量或函数的引用。可以这么理解,extern 是用来在另一个文件中声明一个全局变量或函数。
有点类似JAVA里的public