http://blog.csdn.net/cywosp/article/details/5250840 1、int 4字节long 8字节 float 4字节 double 8字节 long double 16字节 2、一个字符变量只能存放一个字符、一个字节存放一个字节 char c; c = 'a'; c = '/034' c = '/n' c = '/x65' c = 65 c = 0101 c = 0x41 3、运算符操作 -i++等价于-(i++) i = 2; j = -i++; 运算结果i=3 j=-2 4、优先级 !逻辑非 > 算术运算符 > 关系运算符 > &&逻辑与 > ||逻辑或 a = 0; b = 1; c = 2; d = a++&&b++&&--c 等价于 a = 0; b = 1; c = 2; d = (a++) && (b++) && (--c) 结果为 a = 1; b = 1; c = 2; d = 0; a = 0; b = 1; c = 2; d = a++||b++||--c; 等价于 a = 0; b = 1; c = 2; d = (a++) || (b++) || (--c); 结果为 a = 1; b = 2; c = 2; d = 1; 5、复合赋值运算符 a += b 相当于 a = a + b; a *= b + c 相当于 a = a * (b + c); a = 2; a += a *= a; 等价于 a += (a *= a); 最后a = 8; a = 5; b = 3; int max = --a == b++ ? a++ : b++; 最后max = 4; 6、强制类型转换 int a = 2; int b = 5; (float)b/a等于2.5 (float)(b/a)等于2.0 7、字符串拷贝函数 char *strcpy(char *dest, const char *src); 函数功能:将字符串src复制到字符数组dest中,返回复制的字符串。 src可以是字符数组名、常量或字符指针变量。 dest可以是字符数组名或字符指针变量。若dest是字符指针变量,要注意给该指针变量赋初值。 函数说明: 字符数组1长度应大于等于字符串或字符数组2的长度; 字符数组1应该写成数组名的形式 例如: static char a[10] = "abcdefghi"; char b[] = "happy"; strcpy(a, b); printf("%s/n", a); 结果为:happy 8、字符串连接函数 函数原型: char *strcat(char *dest, const char *src); 函数功能: 删去字符串dest的结束标志'/0',将字符串或字符数组src连同末尾的结束标志一起连接到 字符数组dest尾部,返回连接以后的字符串。 例如: static char a[20] = "My name is "; static char b[10] = "Li Ming"; strcat(a, b); 9、计算字符串长度的函数 函数原型: unsigned int strlen(const char *str); 函数功能: 求出字符串或字符数组中实际字符个数(不包括'/0') 实例: static char st[20] = {"hello/0abc/0abc/0"}; print("%d/n", strlen(st)); 结果:5 10、字符串比较函数 函数原型: int strcmp(const char *s1, const char *s2); 函数功能: 从左到右逐个比较两个字符串s1、s2中各个字符(用字符的ASCII比较), 直到出现不同字符或遇到结束标记为止。 函数返回值: 0 当串1=串2 负整数 当串1<串2 正整数 当串1>串2 11、变量的存储特性 1、变量按存在时间分:静态变量,动态变量 静态存储变量:生命期为程序执行的整个过程,在该过程中占有固定的存储空间,也称永久存储 动态存储变量:只生存在某一段时间内。 例如:函数的形参、函数体或分程序中定义的变量,只有当程序进入该函数或分程序 时菜分配存储空间,函数/分程序执行完后,变量的存储空间有被释放。 2、自动型 auto 有形式参数、函数内变量、分程序变量。 进入程序自动分配内存,不长期占用内存。 3、静态型 static 局部静态变量 全局静态变量 都长期占有内存 4、寄存器类型 register 将使用频率高的变量定义为register型,可以提高运行速度。 寄存器变量只限于整型、字符型、指针型的局部变量。 寄存器变量是动态变量,仅允许说明两个寄存器变量。 例如: register int d; register char c; 5、引用型 extern 如果某个模块文件中要用到另一个模块文件中的全局变量,要用extern说明。 定义时分配内存,其他文件引用时不再分配内存。 例如: 程序模块file1.c中定义了全局变量 int s; 另一程序file2.c的函数fun1()需要使用这个变量s。 在file2.c的fun1()对s进行外部变量说明: fun1() { extern int s; /*表明变量s是在其他文件定义的*/ ..... } 12、文件包含预处理(#include) #include <文件名> 包含标准头文件(/usr/include下的) #include "文件名" 包含自定义的头文件(在当前目录) 13、指针 概念:一个变量的地址称为该变量的指针 指针变量:专门用于存储其它变量地址的变量 指针变量三要素: 指针变量的类型:和其所指变量的类型一致。 指针变量的值:另一个变量在内存的地址。 指针变量的名字:起法同普通变量一样。 int* p1, p2;其中p1是指针而p2不是指针是一般的整形变量 两个运算符 *:求其后内存地址中的内容。 &:求变量的内存地址。 例: 1、若已经执行了"pointer_1 = &a",则: "&*point_1"的含义是什么? 答:相当于&a (*point_1)++相当于a++ 2、*&a的含义是什么? 答:a 指针的指针:指向指针变量的指针。 定义形式:类型 **变量名; 例如: int i, *p, **q; i = 30; p = &i; q = &p; printf("%d, %d, %d/n", i, *p, **q); 输出的结果式样的。 #include <stdio.h> int main() { int a, b; int *p1, *p2; void swap(int *pa, int *pb); scanf("%d%d", &a, &b); p1 = &a; p2 = &b; if (a < b) { swap(p1, p2); } printf("/n%d, %d/n", a, b); return 0; } void swap(pa, pb) int *pa, *pb; { int *p; p = pa; pa = pb; pb = p; } 指针函数 返回值是指针类型的函数,称为指针函数。 例如: int *a(int x, float y) {...} 指向函数的指针 1、函数名代表函数的入口地址 2、指向函数的指针的定义方式: 类型 (*指针变量名)(); 例如:int (*p)() int max(...) {...} p = max; #include <stdio.h> int main() { int max(); int (*p)(); int a, b, c; p = max; scanf("%d%d", &a, &b); c = (*p)(a, b); printf("a = %d, b = %d, max = %d/n", a, b, c); return 0; } int max(a, b) int a, b; { return a > b ? a : b; } 指针与数组 指向一维数组的指针:int *p; int a[10]; p = a; 数组名的含义:就是数组的首地址 若有数组及指针定义 int a[5], *p = a; 下标法:a[0] a[1] a[2] a[3] a[4] 指针法:*p *(p+1) *(p+2) *(p+3) *(p+4) p[0] p[1] p[2] p[3] p[4] *a *(a+1) *(a+2) *(a+3) *(a+4) 注意事项: 例如有定义:int a[10], *p; p = a; p++;合法,但a++不合法(a是数组名,代表数组首地址,是常数地址。) 要注意指针变量的当前值。 注意指针变量的有关运算 一下结论都在使指针指向数组a,即有p = a;前提下得出 p++; (或p += 1) p将指向下一元素,即a[1]。 x = *p++; *与++是同级运算符,等价于先计算*p,为x赋值a[0];p再自增1,新的p指向a[1]。 *(p++)是先取*p的值,后使p加1. *(++p)是先使p加1,后取*p的值。 (*p)++表示p所指向的元素值加1(即a[0]++),而不是指针值p加1。 14、共用体 概念:使几个不同的变量占用同一段内存空间的结构称为共用体。 共用体类型的定义: union 共用体类型名 {成员列表;}; *共用体变量占用的内存空间,等于最长成员的长度,而不是个成员长度之和。 特点: 1、系统采用覆盖技术,实现共用变量各成员的内存共享,所以在某一时刻, 存放的和起作用的是最后一次存放的成员值 例如:执行un1.i = 1;un1.ch = 'c', un1.f = 3.14后,uni,f才是有效的成员。 2、由于所有成员共享同一内存空间,故共用变量与其各成员的地址相同。 例如:&un1 = &un1.i = &un1.ch = &un1.f 3、不能对共用变量进行初始化;也不能将共用变量作为函数参数,以及使函数返回一个 共用数据,但可以使用指向共用变量的指针。 4、共用类型可以出现在结构类型定义中,反之亦然。 15、枚举型 定义:enum 枚举类型名 {取值表}; 例如:enum weekdays {sun, mon, tue, wed, thu, fri, sat}; 变量定义: enum weekdays workday; enum weekdays {sun, mon, tue, wed, thu, fri, sat} workday; 枚举元素作为常量是有值的:定义时的顺序号(从0开始),所以枚举元素可以进行比较, 比较规则是:序号大者为大。sun = 0; mon = 1;....sat = 6,所以mon > sun、sat最大。 枚举元素的值也是可以认为改变的:定义时由程序制定。 例如: enum weekdays {sun = 7, mon = 1, tue, wed, thu, fri, sat}; 则sun = 7,mon = 1,从tue = 2开始,依次增1. 16、typedef与#define有相似之处,但二者是不同的:前者是由编译器在编译时处理的;后者是由 编译预处理时处理的,而且只能作简单的字符串替换。 17、位段结构 有时,存储1各信息不必占用1个字节,只需二进制的1个或多个位就够用。 如果仍然使用结构类型,则造成内存空间的浪费。为此,c语言引入了位段类型。 位段的概念与定义 所谓位段类型,是一种特殊的结构类型,其所有成员均以二进制为单位定义长度,并称成员为位段。 例如:cpu的状态寄存器,按位段类型定义如下: struct status { unsigned sign: 1; /*符号标志*/ unsigned zero: 1; /*零标志*/ unsigned carry: 1; /*进位标志*/ unsigned parity: 1; /*奇偶/溢出标志*/ unsigned half_carry: 1; /*半进位标志*/ unsigned negative: 1; /*减标志*/ }flags; |
|