C语言代码文件类型分为两种:1、xxx.h(h是header的缩写,代表头文件);2、xxx.c(代表源文件)
printf---print function 打印函数;
printf是库函数的一种,使用时需要引入头文件。
#include<stdio.h>
\\头文件stdio.h中,std代表标准,i是输入,o是输出,所以stdio.h是标准输入输出函数
int main()
\\main函数是程序入口,在一个工程中有且只有一个main函数
在编译时,代码没有错误但是仍然会报警?
#define _CRT_SECURE_NO_WARRINGS 1
\\消去所有VS编译器认为不安全的函数所产生的警告
C语言的数据类型
char--字符数据类型
整数
short--短整型
int--整型
long--长整型
long long -- 更长的整型
小数
float -- 单精度浮点数
double--双精度浮点数
计算机中容量单位-----bit(比特),1 bit支撑存储0或者1
byte(字节) 1 byte=8 bit
byte→kB→MB→GB→TB→PB 进位是1024
sizeof(数据类型)-----------计算类型创建变量所需的空间大小。
各变量所需的空间大小【单位:byte(字节)】
char 1
short 2
int 4
long 4或者8,在不同平台所需空间不同,在32为平台为4,64位平台为8
long long 8
float 4
double 8
标准规定:sizeof(long long)【一般为8】≥sizeof(long)≥sizeof(int)
变量的作用域和生命周期
作用域
局部变量的作用域是变量所在的局部范围
全局变量的作用域是整个工程
生命周期:变量从创建到销毁
局部变量:从进作用域开始,出作用域销毁;
全局变量:和整个程序的生命周期相同
常量种类:
1、字面常量,例如100,‘a’,3.14等等;
2、const修饰的常变量-----a是常变量,const int a为常量,不能修改
常变量本质上是变量,但是又不能修改,不是常量
例:
const int n=10; int arr[n]={1,2,3};//报错,数组创建的时候,数组大小必须是常量
3、#define定义的标识符
例:
#difine NUM 100;//此处NUM是常量,可用来定义数组大小。
4、枚举常量
创建一种枚举类型,例:
enum Sex { MALE, FEMALE, SECRET. } int main() { enum Sex sex=MALE;//其中enum Sex是数据类型 printf("%d\n",MALE);//结果是0 printf("%d\n",MALE);//结果是1 printf("%d\n",MALE);//结果是2 return 0; } //枚举常量从0开始赋值
字符串
字符串----结束标志是\0,且结束标志不计入字符串长度
打印字符串用的是%s,
求字符串长度的库函数----strlen(arr1)
sizeof和strlen的区别:
sizeof——计算所占空间的大小,和\0没有关系(计算空间大小时\0要计算进去,\0也占一个字节)
strlen——求字符串长度。以'\0'作为结束
转义字符
\n 换行
\r 回车
\t 水平制表符
\v 垂直制表符
\ddd ddd是三个八进制数字,转换成十进制数字后,代表字符的ASCII码
例:'\061'【061(O)=49(D)】转换成十进制数字49后,输出的是ASCII码值是49的字符。
\\xdd dd是两个十六进制数字,转换成十进制数字后,代表字符的ASCII码
例:'\x5F'【5F(H)=95(D)】转换成十进制数字95后,输出的是ASCII码值是95的字符。
注释
/*.............*/(不能嵌套) //
%f 打印小数
% 取余
位移操作符
<< >>
int a=8; a << 1;//本质上是移动a的二进制
整型是4个字节大小,有32个bit位,存储32位二进制数字
a=8(D)=1000(B),所以a>>1是1000向右移一位,即1000→0100(B)=4(D)
位操作符
& 按位与
^ 按位或
| 按位异或(异或:相同为0,不同为1)
位操作是把十进制转换为二进制,然后经过按位与\或\异或后,再从二进制转换为十进制
赋值操作符
a=a+5→a+=5
同理,+= -= *= /= &= ^= |=
单目操作符 、双目操作符
例:a+b 操作数+操作数→两个操作数,所以+是双目操作符
C语言判断真假——0为假,1为真
!a,+a,-a,sizeof(a)(计算变量所占内存空间的大小)→单目操作符
~a——对一个数的二进制按位取反(用存储在计算机中的二进制(即补码)计算)
整数在内存中存储的是二进制的补码(正整数的原码,反码,补码相同)
所以~a用补码计算
++、-- 两个单目操作符分为前置和后置
前置:先++或--,再使用值
后置:先使用值,再++或--
int a=(int)3.14; 将3.14强制转换为整型
关系操作符
例:
< > >= <= != == 判断操作数之间的关系
逻辑操作符
&& || 结果为真返回1,假则返回0
条件操作符
exp1?exp2:exp3
理解:exp1为真,整个表达式结果是exp2的结果;
exp2为假,整个表达式结果是exp3的结果。
例:MAX=(a>b?a:b);
逗号表达式
exp1,exp2,exp3,exp4...............
从左向右依次计算,但是结果是最后一个表达式的结果
[] 下标引用操作符
() 函数调用操作符
常见关键字
auto—— 一般被省略掉
例:局部变量都是自动创建,自动销毁,所以局部变量是自动变量。
break——跳出循环
case——在switch语句里使用,switch......case.....
continue——继续,用于循环
default——用于switch语句
enum——枚举语句
extern——声明外部符号
goto——直接去往某个位置,跳转
register——寄存器,register int a——建议把a放入寄存器中去
signed——有符号的,例:-5中“-”是符号
unsigned——无符号的,例:5
typedef——类型重命名,例:
typedef unsigned int uint——作用是把数据类型unsigned int 起个别名,即数据类型unsigned int 与 uint等价。
union——联合体/共用体
void——空类型/无类型
volatile——对数据进行修饰,作用是每次读取值时都重新从原始地址中读取
例:
volatile int i=10; int a=i; int b=i;
在这段编码中变量i是随时可能发生变化的,每次使用它的时候必须从i的地址中读取,因而编译器生成的汇编代码会重新从i的地址读取数据放在b中。
在通常的程序编译过程中,代码会进行优化,而优化做法是,由于编译器发现两次从i读数据的代码之间的代码没有对i进行过操作,它会自动把上次读的数据放在b中。而不是重新从i里面读。这样一来,如果i是一个寄存器变量或者表示一个端口数据就容易出错,所以说volatile可以保证对特殊地址的稳定访问。
1
static——修饰局部变量,出生命周期不销毁(改变局部变量的生命周期,变成和程序的生命 周期一样)(PS.修饰后的数据不存储在栈上,存在数据段)
——修饰全局变量,改变了作用域,只能在所在的源文件内使用(全局变量本身是可 以在整个工程里使用,修饰后只能在所在的源文件里使用)(全局变量没有初始 化是会被自动初始化为0)
——修饰函数,改变了使用范围,只能在所在源文件里使用
——释义:静态的
#define——定义常量和宏
例:
#define MAX 100; #define ADD(X,Y) ((X)+(Y));
关于指针
1、指针是一种复合数据类型,可以认为是一种数据类型,也可以认为是定义出的指针变量;
2、指针变量内容是一个地址,因此一个指针可以表示该系统的整个地址集合,故按32位编译代码,则指针大小为4byte;而按照64位编译,大小则为8byte。(关键在于按照64位编译,而不是在64位系统)
3、%p——打印地址
4、
int *a;//int说明a是一个整型变量,而*只说明a是指针变量 int a=10; int *pa=&a; *pa;*——解引用操作符,此时*pa和a等价
关于内存分配
内存分为不同的区:
1、栈区:存储局部变量
2、堆区:动态内存分配
3、静态区:全局变量、静态变量(和生命周期一致)
结构体
一个复杂对象有多重属性,不能用但一直表示出来,例如表示一个人,结构体就是把一个复杂对象的不同特征值用结构体组合成一个对象来进行描述。
例:
姓名、年龄、性别→人(用struct统合)
struct Stu { char name[20]; short age; };//分号必须有 int main() { struct Stu s1={'张三',30}; printf("name=%s,age=%d\n",s1.name,s1.age); struct Stu * ps1=&s1; printf("%s %d\n",ps1->name,ps1->age); return 0; }
结构体指针
struct Stu * ps1=&s1; printf("%s %d\n",ps1->name,ps1->age); };
分支语句
1、if语句
2、switch语句
switch(day) { case 1:printf("周一\n"); break; case 2: ; break; case 3: ; break; case 4: ; break; case 5: ; break; case 6: ; break; case 7: ; break; default:printf("输入错误\n"); break; }