C语言基本介绍
2015年11月17日星期二
上午9:00
C 语言 : 面向过程的高级语言 , 不需要任何运行环境支持便能运行的编程语言9多加练习
注释
2015 年 11 月 17 日 星期二对代码作解释说明 , 辅助试调代码 . 不参加编译 , 只能在一句完整代码后面
// 单行注释
/*
*/ 多行注释
关键字
2015年11月17日星期二
下午9:32
标示符
2015年11月17日星期二
下午9:35
变量
p rintf() 函数
s canf() 函数
C语言的流程控制
2015年11月14日星期六
上午11:42
选择结构:if switch
循环结构:while dowhile for
选择结构语句if
2015年11月14日星期六
上午11:45
用来判定所给条件是否满足,根据判定结果(真或假)决定执行给出两种操作其中一个
If(){}满足条件执行
If(){}else{}满足条件执行一种方案,否则执行另一种
If(){}elseif(){}满足条件执行一种方案 ,不满足则判断第二个条件,第二个条件满足则执行下一个方案,再不满足则判断下一个条件
只要有一个条件满足,后面的条件判断不会继续执行
If(){}elseif(){}else{}满足条件执行一种方案 ,不满足则判断第二个条件,第二个条件满足则执行下一个方案,再不满足则执行else{}内代码
只要有一个条件满足,后面的条件判断和else不会继续执行
If();满足条件执行当前语句
特点:
1一次if语句只能执行给出的所有操作中的一个
2if();只有;前语句有效.且不能定义变量
3出了if();这种用法,if()与{}之间不能有;号
选择结构语句switch
2015年11月14日星期六
下午1:59
编程中用来判定所给定的条件是否满足,根据判定的结果(真或假)决定执行给出的具体操作
作用:可以根据不同的int值匹配执行不同操作
用法:switch(表达式){case常量表达式1:语句1;break;case…;default:语句n;}
当判断int值匹配不同的值执行对应操作时使用,简化代码结构
特点:
1条件结果只能是整数,而case只能是整型常量.注意:case 'a'→case 97
2break可有可无,有则执行完跳出,没有则继续执行,直到遇到下一个break或执行完
3default可有可无,有则如果条件都不满足,会执行这一句,无则条件都不满足,执行结束
4case下面要定义变量必须加{},且case后面的常量值不能重复
5switch语句可以全部用if语句替代,但if语句不能全用switch替代.
条件判断的地方可以进行算数运算,前提是必须是整数
循环结构语句while与do while
2015年11月14日星期六
下午2:00
编程循环语句,当满足条件时进入循环,循环判断,直到不满足条件跳出循环
作用:可以根据条件反复执行一段代码
形式:while(条件){语句} do{语句}while(条件)
当需要重复执行一段代码.或满足一定条件重复执行的一段代码实现相应的功能
特点:
1只有满足条件循环才执行
2死循环会一直循环执行,除非程序强制退出→在终端下按control+c才能强制退出程序,终止死循环
3如果碰到continue,则跳出本次循环继续下一次判断,如果条件成立继续执行循环.在同一作用域下,continue之后不能写代码,因为根本不会执行
4如果遇到break.无论条件是否满足,循环立即结束
5continue与break跳出的都是当前所在循环,对外部循环没有作用
6dowhile至少执行一次,而while不一定
循环结构语句for
2015年11月17日星期二
上午9:06
编程循环语句,当满足条件时开始循环判断执行,直到不满足条件跳出循环
作用:
可以根据条件反复执行一段代码
用法:
for(语句1;语句2;语句3){}第一个语句是开始前执行,第二个语句是判断真假,如果真,则执行大括号里的语句.语句3是每次循环执行完以后执行的语句
执行顺序:语句1→判断语句2是否成立--成立→循环体→语句3→判断语句2是否成立-------直到语句2不成立,for循环终止
注意:
1for循环中定义的变量,只在for循环中有效
2语句1只会执行一次:一般用于初始化.如果用于定义同一类型变量可以定义多个
For(inta=0,b=0; ; ){}
3语句2是条件语句,控制for循环是否继续执行,如果条件不满足,for循环结束.必须要有一个判断结果,如果为空,表示默认为真,是死循环.
4语句3不一定会执行,一般用于控制循环增量或变化.不能放变量定义语句
5for循环的循环体没有限制,可以放任意想执行的语句
特点:
1只有满足条件循环才执行
2死循环会一直循环执行,除非程序强制退出→在终端下按control+c才能强制退出程序,终止死循环
3如果碰到continue,则跳出本次循环继续下一次判断,如果条件成立继续执行循环.在同一作用域下,continue之后不能写代码,因为根本不会执行
4如果遇到break.无论条件是否满足,循环立即结束
5continue与break跳出的都是当前所在循环,对外部循环没有作用
6循环嵌套,如果子循环本身定义了变量,用自己的,如果没有,则会去上上一层的作用域寻找,就近原则.
死循环
如果省略{},则下面不能定义变量,因为作作用域不明确
流程控制总结
2015年11月17日星期二
上午11:24
选择结构:if switch
Switch:代码一旦进入case里,它只会在碰到break以后才会执行结束,否则会一直执行完整个switch语句
循环结构:while dowhile for
能确定次数的时候适合用for,不能确定适合用while
打印图形:
C语言函数
2015年11月14日星期六
下午4:45
编程中对一段功能代码的封装
作用:可以封装代码,方便调用,提高复用性
用法:
定义:返回值类型函数名(形式参数类型参数名1,……){具体代码;return返回值}
调用:函数名(实际参数1,实际参数2….);
特点:
1返回值类型不定义默认是int,如果不需要具体返回值类型用void(return可以省略)
2是否要定义参数看是否有未知内容参与运算,调用时参数必须对应,参数传递的是值
3return可以有多个,但是如果执行到return就不会再执行后面的代码,函数执行结束
4函数不调用不执行,执行顺序看调用顺序
5函数必须定义才能调用,但不能重复定义不能嵌套定义.可以调用别的函数,但是不能自己调用自己(死递归:内存溢出)
参数被用于定义好的函数里以后,不管函数里经过怎样的计算,对于参数本身的值不会有影响
函数的声明
2015年11月17日星期二
下午3:15
对编译系统的说明,用于通知系统在本函数中所调用的函数是什么样的类型
作用:可以告诉编译器我将定义什么函数,从而让别的函数能方便调用
用法:把函数去掉{}拷贝到声明区域(函数里或外)
特点
1只声明可以不创建函数,但调用必须定义函数
2声明可以只有参数类型,省略参数名:intadd(int);
3函数使用前应声明,不声明就默认当返回值是int类型处理,很可能出错
4声明区域可以在其他函数里或外,只要在主函数调用之前声明就可以
注意:
函数返回值是什么类型就用什么类型的变量接取.如果不匹配有时不会报警告
函数总结
2015年11月17日星期二
下午5:17
进制的基本概念
2015年11月17日 星期二
下午10:34
计数方法,二进制,八进制,十进制,十六进制.任何进制的任意位都不能大于或等于其本身.
十六进制数字里不区分大小写
编程中进制的用法及转换
2015年11月18日 星期三
上午9:16
二进制:0b或者0B开头
八进制:0开头
十进制:直接写
十六进制:0x或0X开头(最大F)→0123456789ABCDEF
任何数据在内存中都是二进制,一个字节代表一个8位的二进制
占用x个字节,就表示占用8*x位二进制
进制的转换
数据的取值范围
2015年11月18日 星期三
上午10:18
默认有符号类型
singned和unsigned只能修饰int型char型,int可以省略
unsigned int的取值范围是0~232-1
signed的取值范围是-231-1~231-1
类型说明符
2015年11月18日 星期三
上午10:37
C语言中用来说明某个变量是什么类型的关键字 int float double char….
作用:说明一个变量的类型,从而便于区分及优化内存
用法:写在要定义的变量名前面 long long int=0;
long是当前字节数*2,short是当前字节数/2
%lld
位运算
2015年11月18日 星期三
上午11:16
直接对整数在内存中的二进制位进行操作的方法
只能操作整型数据
作用:直接通过操作二进制的位来实现运算
用法:
&与运算:对应的两个二进位均为1时,结果才为1,否则为0(有假则假==0)
|或运算:对应的两个二进位有一个为1时,结果位就为1,否则为0(有真为真==1)
^异或运算:对应的二进位不同时为1,否则为0(不同为真==1,相同为假==0)注意:1 相同整数相^的结果是0;2 一个数^另一个数两次结果不变2^3^3=2;3 整数相^跟顺序无关;4 任何数^0,数值不变
~取反运算:对整数各二进位进行取反,包括符号位(0变1,1变0,真假互换)→单目操作符
<<左移
>>右移
区别与逻辑运算符&& || !
源码补码反码
转义字符
2015年11月18日 星期三
下午3:00
用来改变字符原有的含义,如\0打印出来的是一个空字符,而不是字符'0'
作用:用来表示常见的那些不能显示的ASCII字符,如换行,引号等
用法:
进制及内存分析总结
2015年11月18日 星期三
下午3:34
把变量a的值跟变量b的值交换的方法:
数组的基本概念
2015年11月18日星期三
下午6:51
用来存储一组数据的容器 构造类型
作用:把同一类型的一组数据统一管理起来
用法:
定义:数据类型 数组名[长度(数量)]
初始化:类型 数组名[(长度)]={元素1,元素2,…}
赋值:数组名[角标(索引)]=值
使用:数组名[角标];如inta=arr[0];
数组是否正确,看是否是同一类型,是否有关联.如果类型不一致,会丢失精度
需要管理一组有关联的数据时使用
特点:
如果省略长度,那么表示,后面初始化几个元素,长度就为几
数组第一个元素的地址就是这个数组的地址二者是一致的 变量寻址是从高位到低位,数组的寻址是从低位到高位
角标不能大于等于数组长度
二维数组
2015年11月19日星期四
上午9:49
用来存储一组数组的容器
作用:用于把同一类型的数组统一管理起来
用法:
定义:类型 数组名[子数组的数量][子数组的长度];
初始化类型 数组名[子数组的数量][子数组的长度]={{数组1},{数组2}….}
赋值:数组名[数组角标][子数组的数据角标]=值;
使用:数组名[数组角标][子数组的数据角标];如inta=arr[0][1];
需要管理一组有关联的数组时使用
特点:
子数组的数量可以不填,dan但子数组的长度必须有值
Inta[][3]={1,2,3,4,5,6};这个是正确的
Inta[3][]={{1,2},{2,3},{3,4}};这个是错误的
字符串
2015年11月20日星期五
下午2:40
是一串字符,也是一个以'\0'结尾的字符数组
作用:表示一串字符或文本数据0
用法:
定义及初始化:chararr[]="abc";或chararr[4]={'a','b','c','\0'};
特点:
中文字符等于三个英文字符
指针
2015年11月21日星期六
上午8:59
Int a=5;
Int*p=&a;
p ==&a变量a的地址 *p ==a变量a &p==p指针p的地址
指针是一个能存地址的数据类型
作用:用于存储某一地址,从而可以通过地址直接对该地址内存空间中的数据进行操作
用法:
当需要存储地址,以便操作该地址及该地址所在的数据的时候使用
指针的所占的字节是8个字节
特点
Int*p;
p=&a;
如果强行使用会报非法内存
Int *p[3]代表定义了一个可以存放3个整型指针的数组
Int (*p)[3]代表定义了一个包含3个元素的int型数组的指针
修改值的写法(*p)[0]=1
指针与数组
2015年11月21日星期六
上午11:46
指针数组:表示一个数组,用来存指针的数组
数组里的元素都是指针,如int *p[3];表示定义一个可以存3个int指针的数组
用法:
赋值:inta=1,b=2,c=3;
int *p[3]={&a,&b,&c};
取值:int *a=p[0];
数组的指针:表示一个指针,而这个指针类型是数组指针类型,如int(*p)[3];表示这是一个含有3个元素的int数组的指针
数组元素的指针:表示一个指针,而这个指针存的是数组一个元素的地址,intarr[1]={1};int *p=&arr[0];
特点:
具体跳几个字节看数组类型int4个,char 1个
指针与二维数组
2015年11月21日星期六
下午2:23
二维指针数组是一个数组,里面的每一个子数组存的元素类型都是指针
二维数组的指针:是一个指针,指针类型是二维数组
指针与数组的本质
2015年11月21日星期六
下午4:19
结论:数组具有指针的一部分特性,但是它不是指针.两者是完全不同的两个数据类型
如果数组当参数传递时或赋值时,仅把里面第一个元素的地址传过去了
指针与函数
2015年11月23日星期一
上午12:57
指针型函数
是函数,这个函数的返回值类型是指针
定义:类型 *函数名(参数){return 指针类型;}
如: int *add(int *a){return a;}表示定义一个返回值是int指针类型的add函数
#include
int *hehe(int *p);
int main(){
int a=1;
int *m =&a;
printf("%p\n",m);
hehe(m);
printf("%p\n",hehe(m));
return 0;
}
int *hehe(int *p){
return p;
}
打印结果
Rio:test a1$ ./a.out
0x7fff58719c18
0x7fff58719c18
函数的指针 →当需要把函数当做参数使用时使用
是指针,函数也会在内存中开辟空间.函数指针即这块空间的地址
定义:函数返回值类型(*指针名)(参数类型);
赋值:指针名=函数名
如:定义函数intadd(inta){….}. Int (*p)(int)=add;
用法:指针名(实参);
如:p(3);等效于add(3); →不同于其他类型指针使用需要前面加*
#include
int haha(int a);
int main(){
int (*p)(int);
p=haha;
int a=1;
a=p(a);
printf("%d\n",a);
return 0;
}
int haha(int a){
return a=a+1;
}
特点:
函数中,不管是什么参数的传递,都是值传递.
指针的类型决定指针移动时跨越的字节数
指针移动不受限制
指针与字符串
2015年11月23日星期一
上午7:54
数组方式定义字符串:char arr[]="abc"; char arr[]={'a','b','c','\0'}; →是变量
指针方式定义字符串:char *p="abc";→是常量
常量区的常量与变量的区别 常量区的常量,只有在程序退出才会销毁,否则会一直存在
1.常量区的常量只有一份,也就是重用的时候,用的都是同一个,地址一样
2.而变量定义的同一个字符串,不同变量地址不同
特点:
指针定义字符串的时候,存的是常量区字符串的首地址
指针定义的字符串是常量,不能被改变,而字符数组定义的是变量,可以被改变
适用场景:
指针字符串与字符数组区别的补充
不能改变
可以改变
打印数组定义的字符串
打印指针定义的字符串
总结
2015年11月24日星期二
上午10:38
指针不赋值是野指针,其值是随机地址
指针赋值0.是空指针
注意,指针本身的地址和存的地址是不一样的.
指针本身的地址是不能改变的,而它存的地址是可以改变的
要点:指针移动的字节数,只跟指针的类型有关
指针是什么类型,移动一步就跨越该类型相对应的字节数
全局变量
2015年11月24日星期二
上午10:54
在所有函数外部定义的变量,称为全局变量
作用:用于存储一个需要长期存于内存,并需要改变的变量
用法:跟普通变量没区别,只在位置在所有函数之外
Int add();
Int a;
Int main(){
add();
add();
printf("%d",a);
return 0;
}
Int add(){]
a++;
return 0;
}
当需要定义一个随程序一直存于内存中,并可以被其他函数共享的变量的时候使用
特点: 程序启动时就存在
这里跟普通变量不同,普通变量不初始化,默认值是随机数
在定义时,即使定义多次,也是同一个变量,
→包括指针 0x0
结构体
2015年11月24日星期二
上午11:29
数据类型,是构造类型,可以存不同类型的数据
作用:用于封装不同类型的数据类型到一个结构中,方便使用
用法: 此为自定义
定义:1.定义结构体类型struct 结构体类型{数据类型1 名称;数据类型2 名称;…};
structhehe{charxixi;inthuhu;};
2.定义结构体变量及类型:struct 结构体类型 变量名={数据1,数据2,…};
structhehe p1={"mnm",3};
取值:变量名,结构体元素变量名;
赋值:变量名,结构体元素变量名=新值;
当需要把相关联的不同数据类型封装起来一起使用的时候使用结构体
特点:
嵌套定义
批量重新赋值方法,如果不这样,必须要每个元素单独赋值
全局结构体
结构体数组
2015年11月24日星期二
下午4:15
是数组,只不过数组里每一个元素都是结构体类型
作用:存储多个有关联的结构体
用法:
定义及初始化赋值:struct结构体类型数组名[长度={结构体1,结构体2};
结构体指针
2015年11月24日星期二
下午4:23
是指针,只不过指针类型是结构体类型
作用:存储结构体地址,并操作地址对应的结构体空间里的数据
用法:
指针移动对结构体本身没有意义,结构体名并不包含第一个元素的地址
结构体内存分配
2015年11月24日星期二
下午5:03
结构体分配内存遵循两个原则 -->对齐原则/对齐算法
1.每个元素的偏移量(当前元素首地址距离整个结构体首地址的字节数)必须是自己所占有字节的整数倍,如果不够,补齐上个元素的字节数
2.整个结构体的字节数必须是其最大元素字节的整数倍,如果不够,最后一个元素填充字节
作用:增加cpu寻址效率
枚举
2015年11月24日星期二
下午7:13
是一种构造类型的数据类型.里面存的都是有别名的整型常量
作用:可以把多个整型常量以别名的形式封装成一个整体,便于别的变量识别并取值使用
用法:
取值:变量名=枚举元素名
枚举一旦类型定义成功以后里面的数据常量不能改变
特点:
如果设定一个元素的值,那么后面元素的值都按此元素的值排列
1.定义枚举类型 enum 枚举类型{元素1 , 元素1 , …};
或{元素1=0,元素2=1,}
*/
enumDay{
MONNING,//0 注意每个元素后面是逗号
NOON,//1
NIGHT,//2
};
//2.定义枚举变量及赋值: enum 枚举类型 变量名=对应枚举里的一个元素名;
enum Daydaystatus=MONNING;
// 取值:变量名=枚举元素名;
daystatus=MONNING;
printf("daystatus=%d\n",daystatus);
宏定义
2015年11月26日星期四
上午1:37
是一个替换代码的预处理指令
作用:在编译之前进行代码替换
用法:
开始替换:#define被替换内容 替换成的内容 →不要加分号;
如:#define kLength 6 表示从这行开始下面所有代码中的kLength替换成6
结束替换: #undef被替换内容 如:#undefkLength表示到这一行,宏定义失效
当需要重复性代码或简单的函数运算时使用,提高效率
特点:
防止出现(2+3)*(3+4)→2+3*3+4
条件编译
2015年11月26日星期四
上午3:04
是根据条件编译代码的预处理指令
作用:可以让一段代码只在满足条件才编译,提高编译效率
用法:
通用:#if条件表达式 #elif 条件表达式 #else
与宏定义相关:
#ifdef宏名 表示定义了宏 #ifndef宏名 表示没有定义宏
#endif 结束条件编译,注意,一定要加
当一些代码只需要在特定条件下编译时使用
特定:
#include的用法
2015年11月17日星期二
下午4:17
C语言中的一个预处理指令
作用:把一个文件的内容拷贝到这行命令所在的位置
用法:
引用:自定义的文件:#include "文件路径和名称"
编译器类库里的文件:#include <文件名>
当程序需要用到别的文件时使用
特点:
1可以定义在函数外,也可以放在函数内
2必须包含路径,省略或 ./ 表示当前路径 /开头表示绝对路径 ../表示上一层路径
3以#开头,后面不能加分号;
4必须定义在要使用之前,否则可以编译通过生成.o文件,但不能链接成功
#include是单纯的替换
C语言的头文件
2015年11月17日星期二
下午4:04
C语言中以.h结尾的文件,如stdio.h
作用:用于声明一个函数,把多个代码文件中的函数,声明在这个文件中,便于重用防止定义冲突
用法:
定义:新建一个以.h结尾的文件,把需要用到的函数的声明直接放在里面..h文件中不能有主函数
引用:自定义的头文件:#include "头文件名.h"
编译器类库里的头文件:#include <头文件名.h>
当程序需要由多个.c文件组成时使用
特点:
1在头文件中仅作声明,不做具体使用
2在头文件有声明只能确保编译成功成.o文件,但不确保能链接成功
3自定义的头文件引用必须要有路径,如果.h文件跟.c文件都在同一目录下可以不加路径,否则必须要有路径 头文件路径错误是代码报错的一大问题
在终端中cc -c文件名1.c文件名2.c 把连续编译并链接两个.c文件,链接的所有文件只有一个主函数.
递归
2015年11月26日星期四
上午6:52
是指在函数的定义中使用函数自身的方法,就是函数自己调用自己
作用:实现一些反复执行的操作
用法:
Int add(int a){
If(a==0)return 0;
Return a+add(a-1);
}
必须要有一个确切的返回节点,不再继续调用,否则就是死递归
当有一些反复的操作,但没有告知明确次数的时候使用
特点:可以用循环实现递归的所有操作→递归可以用循环替换
德罗斯特效应
文件操作
2015年11月26日星期四
上午7:22