//大学C语言教材
C语言区分大小写;关键字和基本语句必须小写;
C语言的标识符:
类型标识符:int char float double long short unsigned struct union enum auto void extern register static typedef
控制标识符:goto return continue break if else for do while switch default
预处理标识符:define include undef ifdef endif
其它标识符:sizeof volatile
整型常数:除了正负号之外,以0开头为8进制数,以0x开头为16进制数,其它为10进制数;
一般微机的字长为16位,则:
整型-----------int--------------16位;
短整型---------short int--------16位;(与整型相同)
长整型---------long int---------32位;
无符号整型-----unsigned int-----16位;
无符号短整型---unsigned short---16位;
无符号长整型---unsigned long----32位;
实型常数:又称浮点数,有一定的有效数字位数;(有效数字定义:从左边第一个非0的数字起向右到最后一个数字)
写法如下:
小数写法:0.325 -325.0
指数写法:3.25e-1 -3.25e2
单精度(float):占用32位空间,含7位有效数字;
双精度(double):占用64位空间,含15-16位有效数字;
转义字符常量:
\\代表\; \'代表'; \n代表换行;\t代表横向跳格(8列);
\v代表竖向跳格;\b代表退格;\r代表回车; \f代表走纸换页;
\ddd代表由3位8进制ASCII码对应的字符;
\xhh代表由2位16进制ASCII码对应的字符;
字符常量占用8位空间;
算术运算符:+加法;-减法;*乘法;/除法;%求余;
关系运算符:〈小于;〈=小于等于;〉大于;〉=大于等于;==等于;!=不等于;
逻辑运算符:&&逻辑与;||逻辑或;!逻辑非;
位运算符:&按位与;|按位或;^按位异或;~按位反;〈〈左移;〉〉右移;
运算符的优先级:括号---〉逻辑非---〉算术运算---〉关系运算---〉逻辑与,逻辑或---〉赋值运算;
位运算符的优先级:~按位反---〉〈〈左移,〉〉右移---〉&按位与---〉^按位异或---〉|按位或;
ASCII码表和运算符的优先级可参考书中附录;
赋值运算的类型转换:
源类型 | 目标类型 | 说明 |
实型 | 整型 | 舍弃小数 |
字符型 | 实型 | 有效位补0 |
字符型 | 整型 | 保存ASCII码数值,同时把ASCII码的最高位作为/不作为符号位 |
整型 | 长整型 | 不变 |
无符号整型 | 长整型 | 不变 |
无符号类型 | 同长度类型 | 不变 |
非无符号类型 | 同长度无符号类型 | 不变 |
输入/输出函数中格式控制字符的使用格式:%[附加符][域宽][控制符],其中,%是强调字符
格式控制字符中的空格,制表符(\t),或换行符(\n)没有意义。
格式控制符和附加符:
控制符 | 说明 | 附加符 | 说明 |
%d | 有符号十进制整数 | l | 长整型 |
%o | 八进制整数 | h | 短整型 |
%x | 16进制整数 | m(正整数) | 数据最小宽度 |
%c | 字符 | * | 空读一位数据 |
%s | 字符串 | n(正整数) | n位小数位数或截取n位字符 |
%f | 小数形式的实数 | -(负号) | 左对齐 |
%e | 指数形式的实数 | ||
%u | 无符号十进制 | ||
%g | 选取较短的形式(%f或%e) | ||
%% | 输出百分号 |
指针就是各种变量的内存地址;指针变量就是*后面的字符,它的值是指针;
局部变量和全局变量的区别:函数内/函数前;全局变量可用extern在函数中声明,以提前使用;
动态变量和静态变量的区别:用完释放/保持;动态变量一般是函数内定义的局部变量,声明的关键字auto一般省略,另一种关键字register用于速度较高的应用;静态变量既可作局部变量,也可作全局变量,声明关键字为static;
内部函数:用static声明,其他源文件无法调用;反之,用extern声明(或者不声明),则其他源文件可以调用,是外部函数;调用外部函数时,必须先用extern声明才能使用;
===================================
结构体指针:
(*p1).name与p1->name等价。
p1++代表指向结构体数组中的下一组。
==================
结构体作为函数参数时,函数的定义形式如下:
void print(s)
struct student s;
{...}
调用时,print(结构体例化名)。
==================
结构体指针作为函数参数时,函数定义如下:
update(struct tm *p1)
{...}
调用时,update(&结构体例化名)。
==================
malloc,calloc,free函数-----含于stdlib.h
malloc函数:在内存中分配一个长度为size的连续空间,返回值是该空间起始地址,失败返回0.
void * malloc(unsigned int size);//返回的指针应做强制类型转换。
calloc函数:在内存中分配N个长度为SIZE的连续空间,其余同malloc函数。
void * calloc(unsigned int n,unsigned int size);
free函数:释放最近一次指向的内存空间
void free(void * ptr);
链表基本单元--含有指向自身指针的结构体。例如:
struct student{
long num;
struct student * next;
}
通过malloc函数申请结构体空间,并给next指针赋值,实现链表。
==================
返回值为结构体指针的函数定义:
struct student * creat()//函数名为creat
{struct student *head;
...
return(head);
}
==================
位段---以结构体方式定义的位数据,节省空间。结构体中几个变量的长度总和不超过16位宽。
变量必须用int,unsigned或signed声明。
struct student
{unsigned x:1;//1位宽必须用unsigned定义,因为1位不可能带符号
int y:2;//2位宽度
float pay;//其它变量,可共存于该结构体内
}s0;
先定义的变量处在低位,前述只有3位宽。
通过s0.x和s0.y来访问位段变量。
==================
共用体union---与结构体用法类似,但其各个成员共用一个存储空间。用于代表一个可能是各种类型的变量。
也就是说,空间每次只能分配给一个成员使用,就是最后一次赋值的那个成员变量占用。而且每次只能给一个成员赋值,不能同时赋值。
由于空间共用,给其中某个变量赋值后,也就意味着其它变量也有了一个值。
存储空间的大小按照占用最大的成员空间分配。
==================
预处理:宏定义,文件包含,条件编译;
宏定义:
#define,#undef
例如:#define PI 3.14
main{...}
#undef//PI的宏定义到此结束
----------------------
带参数的宏定义:类似于函数调用,但实际是替换
如#define X(a,b) a*b
则y=X(3,4)就是y=3*4;
-----------------------
条件编译:减少编译量和目标程序大小,不符合条件的语句不被编译。
#ifdef 标识符
程序段1
#else
程序段2
#endif
(如果“标识符”被定义过,则执行程序段1,否则执行程序段2)
---------------------
#ifdef 标识符
程序段
#endif
-------------------------
#ifndef标识符...#else...#endif
#if 表达式或标识符
程序段1
#else
程序段2
#endif(当表达式或标识符为真,执行程序段1)
==================
::作用域运算符,例如,::a,代表引用全局变量a。类名::函数名,代表类的成员函数。
inline---声明内联函数,用于提高函数执行速度,但更费空间。该函数需定义在main之前。
例如:
inline float add(float a,float b)
{float vol;
vol = a+b;
return vol;
}
没有inline声明的函数默认为外联函数。
另外,在类内实现的函数为内联函数。在类外实现的函数(也是该类成员)为外联函数,除非该外联函数用inline声明,则才视为内联函数。
==================
new和delete函数:用于取代malloc和free函数,更灵活。
例如:
new float;
new int(100);//1个Int型的空间,初始化值是100
new int[5][4];
申请什么类型,就返回什么类型的指针,失败返回NULL;
delete ptr;//根据new返回的指针ptr,释放空间。
注意:new和delete是运算符,不是函数,因此执行效率更高。
====================
友员--不是该类的成员函数,但在该类中用friend声明的函数。用于访问该类对象的私有和保护成员。在main中可以直接调用友员函数。
派生类与基类;
单一继承与多重继承;
公有派生;-------成员属性不变
私有派生;-------公变私,保护变私,私还是私
保护派生;-------公变保护,保护还是保护,私还是私
举例:
class A{};
class B{};
class C:public A,private B{};
类C从A和B派生而来,多重继承,对A是公有派生,对B是私有派生。
=============================
virtual--声明类中的函数为虚拟函数,在继承类中默认还是虚拟函数,可以做相同函数声明。但这时继承类和父类的函数功能可以不同,也就是同名函数功能不同。继承类之间也是如此。这就是多态性。
也就是说,父类定义了虚拟函数,则允许子类实现同名函数的新功能。
在子类中声明的虚拟函数,对父类无效,不能反向传递。
=============================