CC++⼋股⽂
⼀、C 的关键字共有32个(关键字,⼜称保留字,是编译器能识别的特殊单词)
数值类型的关键字
char 字符型 short短整型 int整型 long长整型 float浮点型 double双精度浮点型unsigned⽆符号 signed有符号 struct 结构体 union 共⽤体 enum枚举 void 控制语句的关键字
if else switch case default for do while break continue goto return 存储类关键字
auto extern register static const 其他关键字
sizeof typedef volatile
1、const ⽤法
⽤const修饰变量:定义时就必须初始化,以后不能再更改;⽤const修饰形参:该形参在函数⾥不能被改变;
⽤const修饰类成员函数:该函数对成员变量只能进⾏只读操作,就是const类成员函数是不能修改成员
变量的数值的;const修饰变量const int a:使变量相当于“常量”;
const修饰指针类型const int *p:不能改变指针变量指向的内存地址的值,但可以改变指向的地址;const修饰指针变量 int *const p:不能改变指针变量指向的内存地址,但可以改变指针指向地址的值;const int *const p:不能改变指针指向的地址,也不能改变指针指向地址的值;修饰谁谁不变;
2、static ⽤法
static修饰局部变量:使其变为静态存储⽅式(静态数据区),那么这个局部变量在函数执⾏完成之后不会被释放,⽽是继续保留在内存中;
static修饰全局变量:当源程序定义了全局变量时,其他外部程序可以通过extern关键字引⽤此变量,如果加了static关键字,则其他⽂件不可连接或引⽤该变量。即全局变量则对当前源程序有效;static1.c⽂件
static1.h⽂件
#
include "static1.h"#include <stdio.h>int value = 1;void funtion (){
printf ("hello world!");}
main()⽂件
最后输出的结果value等于12,当把int value = 1改为static int value = 1,运⾏之后会报错,⽆法解析到外部符号value.
static函数与普通函数的作⽤域不同:被static修饰的函数,只能在当前的源⽂件中使⽤,可以简称为内部函数,对于当前源⽂件以外使⽤的函数,应该在头⽂件中进⾏声明,要使⽤这些函数的源⽂件要包含这个头⽂件,但不能访问到static修饰的函数;
3、volatile 作⽤
当⼀个值可能随时会发⽣改变时,编译器就不能去假设这个变量,优化器每次⽤到这个变量都必须去内存重新读取,⽽不是使⽤保存在寄存器⾥边的值。
4、typedef 作⽤
通过typedef 可以为已有类型取⼀个新的名字。
⼆、数据类型所占的字节数(64位系统)
数据类型字节数char 1short 2int 4float 4double 8long 8long long
8
溢出:在数据进⾏操作的时候导致超出数据类型⼤⼩,会向前位进1,多于原始数据⼤⼩,会被系统舍弃,保留后⾯数据⼤⼩1. 整型数据在内存中所占的字节数与所选择的操作系统有关,long的数据类型长度不能⽐int的⼩,int不能⽐short⼩2. 当⼀个⼩的数据类型赋值给⼀个⼤的,系统会⾃动转换,不会报错,当⼀个⼤的数据类型赋值给⼩的,很有可能会丢失⾼位
三、C 代码编译成可执⾏⽂件4步骤
#
ifndef __STATIC1_H #define __STATIC1_H void funtion ();#endif
#
include <stdio.h>#include "static1.h"extern int value ;int main (){
value = 12;
printf ("value 的值:%d", value );}
预处理:宏定义展开,头⽂件展开,条件编译等,同时将代码中的注释删除,这⾥不会检查语法编译:检查语法,将预处理后⽂件编译⽣成汇编⽂件汇编:将汇编⽂件⽣成⽬标⽂件(⼆进制⽂件)
链接:C语⾔写的程序是需要依赖各种库的,所以编译之后还需要把库链接到最终的可执⾏⽂件程序中去linux编译gcc常⽤选项说明:
参数作⽤static修饰的变量
-o file 指定⽣成输出的⽂件名为file
-E 只进⾏预处理-S(⼤写)只进⾏预处理和编译-c(⼩写)
只进⾏预处理、编译和汇编
四、C 语⾔的内存分区
可参考
栈区(stack):存放函数的参数值、返回值、局部变量等堆区(heap):⽤于动态内存分配全局区/静态区
未初始化数据(bss):全局未初始化、静态未初始化数据初始化数据(data):全局初始化、静态初始化数据⽂字常量区(data):字符串常量
代码区(text):可执⾏⽂件的⼆进制代码(函数)
栈是向下⽣长,堆是向上⽣长,具体可以参考具体实例:
五、计算机字符存储形式
#include <stdio.h>
int a0 = 0; //全局初始化变量;⽣命周期是整个程序运⾏期间;存储在data 区;作⽤域是所有⽂件static int a1;//全局未初始化变量;⽣命周期是整个程序运⾏期间;存储在bss 区;作⽤域只限本⽂件onst static a2 = 2;//全局静态变量,相当于常量;
extern int a3;//全局初始化变量;同a1,但它会到其他⽂件变量int main (void ){
int a4;//局部变量,⽣命周期调⽤函数开始到结束,跟函数共存亡,作⽤域只限在本函数,存储位置是栈 volatile int a5;//局部易变的变量,其他同a4 return 0; }
在计算机中,数值⼀律⽤补码来存储正数的原码,反码,补码,都⼀样负数的反码符号位不动,其他位求反负数的补码为它的反码加1
补码符号位不动,其他位求反,最后整个数加1,得到原码
六、指针分类
地址0-255都是系统保留的,不能读,也不能写
野指针:是指向⼀个未知的内存空间,可能在读写的过程中出现错误
空指针:是指向内存编号为0(NULL)的空间,操作该内存空间会报错,⼀般⽤在程序条件判断万能指针: void *p=&a, 赋值的时候需要强制转换成a的类型
七、函数的声明,定义,调⽤
extern:引⽤同⼀⽂件或不同⽂件的变量或者函数,变量必须是全局变量。
在定义函数时指定的形参,在未出现函数调⽤时,它们并不占内存中的存储单元,所以它们本⾝实际意义上存在的,因此,形参不能提前赋值。
形参出现在函数的定义中,在整个函数体内都可以使⽤,离开函数则不能使⽤
实参出现在主调函数中,不⼀定是主函数,进⼊被调函数之后,实参则不能使⽤,即形参的改变不会改变实参实参变量对形参变量的数据传递的“值的传递”,即单向传递,只由实参传给形参,⽽不能形参传回来实参当实参变量对形参变量的传递是“地址传递”时,形参所做的所有改变都会改变实参的值。在调⽤函数时,编译系统临时给形参分配存储单元。在调⽤结束后,形参单元才被释放
实参单元与形参单元是不同的单元。调⽤结束后,形参单元被释放,函数调⽤结束返回主调函数后则不能再使⽤该形参变量。实参单元仍保留并维持原值。因此,在执⾏⼀个被调函数时,形参的值如果发⽣改变,并不会改变主调函数中实参的值。
exit()函数:关闭所有⽂件,终⽌正在执⾏的⽂件
所在头⽂件stdlib.h
exit(1) 表⽰异常退出,这个1是返回操作系统的exit(x)(x不为0)都表⽰异常退出exit(0)表⽰正常退出
#
include <stdio.h>int main (){ //引⽤
extern int add (int a ,int b ); //调⽤
int a = add (10,20); return 0;}//定义
int add (int a ,int b ){ return a +b ;}
引⽤(&取别名)
&可以是取地址符,将⼀个变量取地址赋值给指针
也可以作为变量的引⽤,如int &a = arr; 在声明引⽤时,必须同时对其初始化,引⽤声明之后,就相当于给变量arr取了⼀个别名a。
引⽤本⾝不是⼀种数据类型,因此引⽤本⾝不占⽤存储单元,对引⽤求地址就相当于对⽬标变量求地址
不能建⽴数组的引⽤,因为数组是⼀个由若⼲个元素所组成的集合,所以⽆法建⽴引⽤
引⽤最⼤的作⽤是作为函数的参数
以前的函数参数的传递是值传递,在被调函数对形参的操作不会影响到实参,⽽引⽤的效果跟传递指针的效果⼀样,即被调函数的形参操作会改变实参。
使⽤引⽤传递函数的参数时,在内存空间并没有产⽣实参的副本,它是直接对实参进⾏操作;⽽使⽤值的传递,需要在内存中申请出同样⼤⼩的空间,对实参进⾏⼀份拷贝,即形参相当于实参的⼀个副本;如果传递的是对象等⼤块数据时,使⽤引⽤⽐⼀般变量传递参数的效率和所占的空间⼩。
使⽤常引⽤,保护传递给函数的数据不在函数中被改变
const 类型标识符 &引⽤名 = ⽬标变量名
通过这种⽅式传递给被调函数,被调函数不能对⽬标变量进⾏修改,只有只读的权利
⼋、⾯向对象的四⼤特性:封装,抽象,继承,多态
九、⼗⼤排序算法
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论