C语言标识符的命名规则变量名可以由字母、数字和_(下划线)组合而成变量名不能包含除_ 以外的任何特殊字符,如:%、# 、逗号、空格等变量名必须以字母或_(下划线)开头变量名不能包含空白字符(换行符、空格和制表符称为空白字符)C 语言中的某些词(例如int 和float 等)称为保留字,具有特殊意义,不能用作变量名C 语言区分大小写,因此变量price 与变量PRICE 是两个不同的变量C语言的基本元素:常量常量的特点:1.在程序中保持不变2.在程序中,常量可以不经说明而直接使用常量的分类:1.直接常量:对应数据类型的常量整形常量:12U、0L、-3实型常量:4.6F、-1.23字符常量:…a‟、‘b‟ 等字符串常量“Hello!”2.标识符:用来标识变量名、符号常量名、函数名、数组名、文件名的有效字符序列。
有时常量定义成宏的形式:#define 标识符常量单精度float 和双精度double1.float为单精度实数,double为双精度实数2.在一般计算机中,为float类型的变量分配4个字节的存储单元,为double类型变量分配8个字节的存储单元3.float数值范围约在-10e38~10e38,并提供6~7位有效数字位,绝对值小于10e38的数被处理成零值(MAC提供7位有效数字)4.double数值范围约在-10e308~10e308,并提供15~16位有效数字,绝对值小于10e308的数被处理成零值(MAC提供15位有效数字)%m.nfm表示最小字符宽度,当实际字符显示,小于该值时,自动补空格,正数时数字右对齐,负数时,左对齐例如%3d 对应 1 的话,就是##1 %-3d 对应 1 的话,就是1## 当实际的显示大于m,那就按实际输出,也就是m无意义了例如%3d 对应1234 的话,就是1234 没有空格还有要注意,这里说的是字符的宽度,小数点. 也要算进n指的是小数点后面的数字个数(不包括小数点)认知:实际上m没有确实的意义,n才有意义变量内存分析1.字节以”字节为单位”注:0xffc1为地址2.变量的存储(1)所占用字节数跟类型有关,也跟编译器环境有关(2)变量内存是从小到大寻址的,优先分配内存地址较小的字节给变量测试用例:(这要看电脑)32位编译器64位编译器char 1 1int 4 4float 4 4double 8 8short 2 2long 4 8long long 8 8void* 4 8内存0xffc1字节0xffc3字节0xffc2字节0xffc4字节0xffc6字节0xffc5字节运行结果:运行符号优先级~ 位取反的讲解1.常数在计算机当中是怎么存储的?正数:以原码存储(正数的补码就是原码)负数:以补码存储(负数的补码是原码的反码加1)2.为什么常数要以补码的形式在计算机中存储?如果负数也以原码的形式存储的话(-1+1=1这个事件就不成立),所以负数要以补码的形式存在计算机当中3.常数在计算机当中是以补码形式存储,但是是要以原码显示的3.~8对8按位取反8======》0000 1000~8======》1111 0111以这种形式存储在计算机当中~8======》1000 1001 以这种形式输出printf和putchar1.printf返回值为当前双引号之间的字符数2.测试用例:运行结果:3.putchar()函数作用是将一个字符输出到输出设备(如显示器)。
它的一般形式为putchar(字符型或整型数据);函数putchar()的可以输出字符型变量、整型变量、字符型常量以及控制字符和转义字符。
scanf和getchar 和fflush1.注意:int a;scanf(“%d\n”,&n);//这种写法是错的,这将导致scanf函数无法结束2.分析scanf的第2个参数传递的不是age变量,而是age变量的地址&age,&是C 语言中的一个地址运算符,可以用来获取变量的地址3.注意:scanf函数当输入的格式是正确的时候,返回值为1;否则返回值为0实例:whille(scanf(“%d”,&a)==1)//这句话判断输入的是否为整型数据3. getchar()函数只能接受单个字符,输入数字也按字符处理。
当输入多于一个字符时,只接收第一个字符。
使用getchar()函数时需要注意这一点。
4.getchar和scanf的不同点(1)getchar()一次只能接受一个字符(2)getchar()可以接收回车字符。
而scanf()将回车作为数据的间隔符或结束符。
(3)getchar()接收的字符可以不赋给任何变量5.函数fflush()用于清空输入缓冲区。
stdin是标准的输入,即键盘输入。
分配给键盘的缓冲区需要清空,以便存储新数据。
有时,键盘缓冲区中保留着旧信息,如果不清空,在接受字符时会将旧信息返回,这样就可能引发错误进制1.二进制特点:只有0和1,逢2进1书写格式:0b开头使用场合:二进制指令\二进制文件,变量在内存中就是二进制存储二进制和十进制的互相转换n为二进制位所能表示的数据范围(不考虑负数):0~2的n次方-12.八进制特点:0~7,逢八进一书写格式:0开头八进制和二进制的互相转换3.十六进制特点:0~F,逢十六进一书写格式:0x或者0X开头十六进制和二进制的互相转换4.总结:printf以不同进制形式进行输出5.二进制存储形式测试用例:转换字符串参数变量的类型要求的实际输入%d int 十进制数字序列%ld long 十进制数字序列%f float 十进制数,可以有小数点及指数部分%lf double 十进制数,可以有小数点及指数部分运行结果:奇偶性算法1.用取余的方式%2.用位与&如:7&1=1;//为奇8&1=0;//为偶预处理1.预处理含义:预处理指令在代码翻译成0和1之前执行;预处理的指令可以写在任意位置,预处理指令的作用域,从编写指令的那一行开始,直到文件结尾.令分为3种:(1)宏定义#define //定宏#undef //解宏(2)条件编译(不一定所有的都会参与编译,符合条件才会被编译)#if 条件#elsif 条件#else#endif(3)文件包含(头文件包含)多团队合作编译文件1.测试用例编译文件:gcc -c main.cgcc -c sum.c链接:gcc main.o sum.o链接:把项目中的所有相关联的.o目标文件,C语言函数库合并在一起,生成可执行文件.头文件.h是不参与编译链接全局变量和局部变量全局变量分为2种:1.外部变量:定义的变量能被文件和其他文件访问(1)默认情况下,所有的全局变量都是外部变量(2)不同文件的同名变量,都代表一个变量,extern int a;只起声明变量的作用2.内部变量:定义的变量只能被本文件访问,不能被其他文件访问如:static int a;3.static修饰局部变量:延长局部变量的生命周期,程序结束的时候才会被销毁,并没有改变局部变量的作用域局部变量:不能在函数体外使用注意:当全局变量和变量重名的时候,局部变量会看不见全局变量变量的作用域和生存周期1.根据变量的作用域可以将变量划分为:局部变量和全局变量2.根据变量的存储类型(决定生存期)将变量划分为:自动变量、寄存器变量、静态变量、外部变量3.静态局部变量的生存期为整个源程序,但其作用域为定义该变量的函数4.静态全局变量的生存期为整个源程序,其作用域为定义该变量的源文件传值和传址1.采用传值调用方式时,在被调用函数中改变形参的值,只是改变其副本值,而不会影响调用函数中实参值2.采用引用调用方式时,传递的是变量的地址值,这样在被调函数中,对形参的操作实际上操作的是实参本身3.数组作为函数传递时,实际采用引用调用方式数组1.数组的初始化测试用例:2.数组长度的计算int arr[]={1,3,4,5,6,7};//注意在传参的时候不能这么去计算数组的长度Int length = sizeof(arr)/sizeof(int);3.数组内存存储细节注:数组的地址是首元素的地址数组和函数1.数组作为函数的参数,可以省略元素的个数V oid change (int array[]);//这里是传值V oid change(int *array);//这里是传址二维数组1.二维数组的存储细节字符串1.字符串存储细节2.字符串初始化Char name[8]={…i‟,‟t‟,‟\0‟};Char name[8]=”jdhsw”;Char name[]=”hdsjhds”;Char *name=”fhsjd”;(1)//错误的写法:char name[4]={…i‟,‟t‟,‟g‟};//勉强来说是字符串,应该说是字符数组(2)//错误的写法:char name[]={…i‟,‟t‟};//是数组而不是字符串3.‟\0‟的作用测试用例:运行结果:测试用例内存分析:字符串操作函数1.字符串拷贝行数strcpy、memcpy2.strcpy和memcpy主要有以下3方面的区别:(1)复制的内容不同,strcpy只能复制字符串,而memcpy可以复制任意内容,例如字符数组,整型,结构体、类。
(2)复制的方法不同。
strcpy不需要指定长度,它遇到被复制字符的串结束符"\0"才结束,所以容易溢出。
memcpy则是根据其第3个参数决定复制的长度(3)用途不同。
通常在复制字符串时用strcpy,而需要复制其他类型数据时则一一般用memcpy3.函数原型:strcpy函数的原型是:char* strcpy(char* dest, const char* src);memcpy函数原型:void *memcpy( void *dest, const void *src, size_t count );4.字符串的其他函数strcpy(); strncpy();strcmp(); strncmp();strcat(); strncat();size_t strlen();char *strstr(const char *haystack, const char *needle);函数功能:在串中查找指定字符串的第一次出现返回值:success(相同字符串的首地址);未找到(NULL)gets和puts(gets已经被遗弃了,请慎用)用fgets代替gets1.gets(char *str);//输入函数2.puts(const char *s);//输出函数,不能按照格式输入,一般用printf代替3.fgets(char * restrict str, int size, FILE * restrict stream);//代替输入函数gets的写法:fgets(name,20,stdin);4.fputs(const char *restrict s, FILE *restrict stream);//代替输出函数puts的写法:fputs(name,stdout);字符串数组5.字符串数组的初始化Char names[2][10]={“jack”,”rode”};Char names[2][10]={{…j‟,‟a‟,‟\0‟},{…r‟,‟o‟,‟s‟,‟\0‟}};指针与数组1.void change(int array[]);2.void change(int *array);//利用一个指针来接收一个数组,指针array指向数组的首元素.3.指针数组Char *name[4]={“jack”,”rode”};指针数组与行指针的区别1、int *p[3];定义的是指针数组,表示一个数组,含有3个元素p[0]、p[1]、p[2],且这3个元素只能存放整型元素的地址2、int (*p)[3];定义的是行指针,表示一个指针变量,它仅有一个存储空间,只能存放一个长度为3的一维数组指针。