标签:
丹尼斯 里奇
1 是一个面向过程的计算机高级语言--不需要任何运行环境便能运行的程序语言;
2 标准:目前是C11 (K&R C—>ANSI C / C89标准—>C99标准——>C11标准)
用法:
1.单行注释 //想注释的内容
2.多行注释: /*想注释的内容*/
用法:
1.由26个英文字母的大小写、10个阿拉伯数字0~9、下划线_,$组成;
注意:
有四大类:整型(int) 浮点型(单精度(float)和双精度(double)) 字符型char 字符串型
特点: 数据不会被改变
变量类型 变量名; 如:int num;
1.赋值 num=1; 2.修改 num=2;
特点:
一,是什么?
在所有函数外部定义的变量,称为全局变量。
二,有什么用?
用于存储一个需要长期存于内存,并需要改变的变量.
三,怎么用?
跟普通变量没区别,只在位置在在所有函数之外.
四,什么时候用?
当需要定义一个随程序一直存于内存中,并可以被其它函数共享的变量时候.
五,有什么特点?
1.生命生期跟随程序.程序启动创建,程序退出其才会销毁
2.作用域是其所在位置之下的所有函数,都可以共享并改变.
3.变量的使用遵循就近原则如果函数内有同名变量,那么用函数自已的.
4.如果没有初始化赋值,默认值是0;
常用格式化字符串:%d 整数 %f 浮点数 %c 单个字符 %s字符串 %p 指针的值
auto double int struct
break else long switch
case enum register typedef
char extern return union
const float short for
signed void if unsigned
default goto sizeof volatil e
do continue while static
一,是什么?
是一个C语言的一个关键字.
二,有什么用?
可以给一个数据类型取一个别名,方便使用.
三,怎么用?
定义: typedef 类型 别名;
如: typedef long int Lint; 表示给一个long int 类型取一个别名为Lint
则: long int a =5;与Lint a=5;二者等效
四,什么时候用?
当希望给一个类型取一个别名时(类型比较复杂等),可以用,方便理解调用.
五,有什么特点?
1.定义位置没有限制,函数内外都可以.
2.作用域为定义位置开始至所处作用域结束.类似于变量
3.可以用于任意数据类型.
4.别名具有数据类型的含义,这是跟宏定义最大区别.
一,是什么?
是C语言的关键字.
二,有什么用?
控制一个变量或函数的作用域.
三,怎么用?
修饰函数:static 返回值 函数名(){};表示函数为内部函数只能被本文件访问.
extern 返回值 函数名(){};表示函数为外部部函数能被程序的所有文件访问.(默认)
修饰全局变量: static:表示变量只能被当前文件访问. extern:所有文件共享.(默认)
修饰局部变量: static:表示延长变量生命周期至程序结束. extern:声名一个全局变量.
四,有什么特点?
1.外部函数不同文件中也不能重名,但内部函数可以
2.同类型全局变量可以重复定义,但在内存中只有一份.
3.可以在函数内声名一个全局变量.但要使用必须在函数外定义. extern只是声名.
4.static修饰定义局部变量,则这个局部变量生命周期延长至程序结束.但作用域不变.
一, 是什么?
是C语言的关键字.
二,有什么用?
auto: 用于定义一个能自动回收的临时变量.这个变量在作用域内用完后会自动销毁.
canst:用于定义一个常量,这个常量在常量区,且在内存中仅有一份.且不能改变.
三,怎么用?
auto 数据类型 变量名;(默认所有局部变量都是被这个修饰,可以省略)
注意: 1. static修饰的除外. 2.全局变量除外;
canst 数据类型 变量名=值;
注意:一但定义,值就固定不能被改变.
如:
const int a;
一, 是什么?
是C语言的关键字.
二,有什么用?
让指令能够不受条件跨越执行.简化代码
三,怎么用?
int a=0;
if(a==0){
goto heima;
}
printf(“itcast\n”);//这行不会执行
heima:printf("heima\n");//直接跳到这里执行
三,什么时候用?
需要不受限制进行指令跳转时.(如:跳出多层循环嵌套)
一, 是什么?
是C语言的关键字.
二,有什么用?
register 表示让程序优先把这个数据存在寄存器中.
volatile 表示让编译器不要去优化代码,不能用缓存,每次使用都必须去内存中获取.
三,怎么用?
修饰变量:
register 数据类型 变量名;
volatile 数据类型 变量名;
四,什么时候用?
register :如果一个变量使用相当频繁且占用内存又不是很大.可以使用.
全局变量与加了static局部变量除外.
volatile : 如果需要让计算机严格按写的指令指执行,且能关注变量每一次值的变化,
这个时候可以使用,则编译器不会对执行指令作优化.
一,是什么?
是用来存储一组数据的容器.
二,有什么用?
用于把同一类型的一组数据统一管理起来.
三,怎么用?
定义: 数据类型 数组名[长度(数量)] ;初始化:类型 数组名[(长度)]:={元素1,元素2,…}
赋值:数组名[角标(索引)]=值; 使用:数组名[角标];如int a=arr[0];
四,什么时候用?
当需要管理一组有关联的数据时.
五,有什么特点?
一,是什么?
是用来存储一组数组的容器.
二,有什么用?
用于把同一类型的一组数组统一管理起来.
三,怎么用?
定义: 类型 数组名[数组的数量][子数组的长度] ;
初始化:类型 数组名[数组的数量][子数组的长度] :={{数组1}, {数组2},…}
赋值: 数组名[数组角标][子数组中数据角标]=值;
使用: 数组名[数组角标][子数组中数据角标];如int a=arr[0][1];
四,什么时候用?
当需要管理一组有关联的数组时.
五,有什么特点?
1.与数组基本一样.但传递子数组时传递的是地址.
2.子数组数量控制行数,单个子数组长度控制列数.
3.每个子数组类型及长度一致.
一,是什么?
是一串字符,也是一个以’\0’结尾的字符数组.
二,有什么用?
用于表示一串字符或文本数据.
三,怎么用?
定义及初始化: char arr[]=“abc”;或char arr[4]={‘a’,’b’,’c’,’\0’}
输出:printf(“%s\n”,s);或printf(“%s\n”,&arr[0]); 赋值:strcpy(字符变量名,“字符串");
四,什么时候用?
当需要表示一串字符或文本的时候.
五,有什么特点?
1.后面必须有’\0’结尾.否则只算普通的字符数组.但’\0’不会输出,只表示字符串结束.
2.字符串输出占位用%s必须遇到\0.才能结束,否则会继续输出更高位地址值的字符.
3.strlen函数用于计算一个字符串的长度(字符数量),使用必须引入<string.h>.
4. strlen不会计算\0.且碰到\0结束,但是sizeof不受\0影响,且长度会包含\0.
5.字符串一定是字符数组,但字符数组不一定是字符串.
一,是什么?
严格上来讲,指针具有两层含义:一是指一种数据类型.二是指一种保存地址的变量. 二,有什么用?
用于存储某一个地址,从而可以通过地址直接对该地址内存空间中的数据进行操作.
三,怎么用?
定义: 类型 *指针名;如:int *p;表示定义一个能存int类型地址的指针变量, 名字叫p.
赋值: 指针变量名=指针(地址).注意:指针获取方法(&变量名).
四,什么时候用?
当需要存储地址,以便于操作该地址及地址对应的内存数据的时候.
五,有什么特点?(注:以下的p表示一个指针变量名)
一,什么是指针数组?
表示一个数组,用来存指针的数组就叫指针数组.数组里面的元素都是指针.
如:int *p[3];表示定义一个可以存三个int指针的数组.
赋值: int a1=1,a2=2,a3=3; int *p[3]={&a1,&a2,&a3}; 取值: int *a=p[0];
二.什么是数组的指针?
表示一个指针,而这个指针类型是数组.
如:int (*p)[3];表示这是一个含有三个元素的int数组的指针.
赋值:int arr[3]={1,2,3}; int (*p)[3]=&arr;
三.什么是数组元素的指针?
表示一个指针,而这个指针存的是数组一个元素的地址. int arr[1]={1}; int *p=&arr[0];
三,有什么特点?
1.数组名表示第一个元素的地址,&数组名表示整个数组的地址.二者值相同,但意义不同.
2.指针可以运算.但仅限于加减运算.运算的实质就是地址运算.即地址的移动.
3.地址(+1)向高位移动,而(-1)向低位移动.不同指针类型移动一位(+1或-1)的字节数不同.
4.实际移动的字节数看指针类型,类型占多少个字节,一位就移动多少个字节.
一,怎么表示一个字符串?
char arr[] = ”likui";
二,怎么用指针表示一个字符串?
char *p = "likui”;
三,怎么表示一个字符串数组?
char arrs[2][8] = {”likui“, ”yingying“};
四.怎么用指针表示一个字符串数组?
char *arrs[2] = {”likui", ”yingying”};
五,有什么特点?
1.指针定义的字符串是常量,不能被改变.而字符数组定义的是变量.可以被改变.
2.指针定义一个字符串,指针存的实际是在常量区的那个字符串的首字符的地址
一,什么是指针型函数?
是函数. 这个函数的返回值类型是指针;
定义:类型 * 函数名(参数){return 指针类型;}
如:int *add(int *a){return &a;}.表示定义一个返回值是int指针类型的add函数.
二,什么是函数指针?
是指针.函数也会在内存开辟一块空间.函数指针即这块空间的地址.
定义:函数返回值类型 (*指针名)(参数类型);赋值:指针名=函数名;
如:先定义函数int add(int a){ //...}. int (*p)(int)=add;
使用:指针名(实参); 如:p(3);等效于add(3);
三,有什么特点?
1.函数指针做加减运算可以,但没有意义.不建议.
2.函数指针可以当作参数传递.因为其是一个指针类型.
3.不管什么类型的指针,只要是指针,其里面存的就是地址.
一,是什么?
是一种数据类型.是构造类型.里面可以存不同类型的数据.
二,有什么用?
用于封装不同的数据类型到一个结构中.方便使用.
三,怎么用?
定义:1.定义结构体类型 struct 结构体类型{数据类型1 名称;数据类型2 名称;…};
2.定义结构体变量及赋值: struct 结构体类型 变量名={数据1,数据2….};
取值:变量名.结构体元素变量名; 赋值:变量名.结构体元素变量名=新值;
四,什么时候用?
当需要把相关联的不同数据类型封装起来一起使用的时候.
五,有什么特点?
1.可在定义结构体类型时同时定义结构体变量名,可定义匿名类型结构体;
2. 同一作用域内不可重复定义结构体类型和结构变量.匿名类型结构体除外;
3.可在函数内也可在函数外,效果及用法类似于局部变量和全局变量.也可嵌套定义.
4.可同时在函数内外定义同一个类型,使用同样遵循就近原则,结构体变量也是如此.
一,是什么?
是数组,只不是数组里每一个元素是结构体类型。
二,有什么用?
用于存储多个有关联的结构体.
三,怎么用?
定义及初始化赋值: struct 结构体类型 数组名[长度]={结构体1,结构体2};
如: struct Person{char *name;int age;};
struct Person per={”itheima",2}; struct Person per1={”itcast",3};
struct Person arr[2]={per,per1};
取值:数组名[角标];单独赋值:数组名[角标]=新的结构体;
如: struct Person per3=arr[0];
四,什么时候用?
当需要存储多个有关联的结构体,并作为一个整体使用时.
五,有什么特点?
1.遵循数组的特点
一,是什么?
是指针,只不是指针类型是结构体类型。
二,有什么用?
用于存储结构体的地址,并操作地址对应的结构体空间里的数据.
三,怎么用?
定义及初始化赋值: struct 结构体类型 *指针名=&结构体变量
如: struct Person{char *name;int age;}; struct Person per={”itheima",2};
struct Person *p=&per;
取值: (*指针名).结构体元素名; 指针名->结构体元素名; (结构体独有的用法)
赋值: (*指针名).结构体元素名=新值; 指针名->结构体元素名=新值
如: (*p).name,(*p).age;或p->name,p->age;
四,什么时候用?
当需要使用指针操作结构体时.
五,有什么特点?
1.指针移动对结构体本身没有意义.结构体名并不包含第一个元素的地址.
一,是什么?
是一种数据类型.称为枚举类型.是构造类型的一种,里面存的都是有别名的整型常量.
二,有什么用?
可以把多个整型常量以别名的形式封装成一个整体,便于别的变量识别并取值使用.
三,怎么用?
定义:1.定义枚举类型 enum 枚举类型{元素1 , 元素1 , …}; 或{元素1=0,元素2=1,}
2.定义枚举变量及赋值: enum 枚举类型 变量名=对应枚举里的一个元素名;
取值:变量名=枚举元素名;
四,什么时候用?
当一个变量只有固定的多个int取值范围时.
五,有什么特点?
1.枚举类型只能是int值,且不能直接用int常量,需要用别名(建议全部大写)
2.如果不设定值,那么默认第一个元素是0,以此类推;
3.同一个作用域内不能出现重复的元素.不同的枚举类型也不行.
一个C程序的片段,对一个功能进行封装,简化代码,提高复用性
定义:
返回值类型 函数名(形式参数类型 参数名1,……){ 具体代码 return 返回值}
调用:
函数名(实际参数1,实际参数2,…..);
声明:
把函数去掉{}拷贝到声明区域(函数里或外)就可以了.返回值 函数名(形式参数1,….)
注意:
一,是什么?
是C语言中以.h结尾的文件,如stdio.h .
二,有什么用?
用于声名(描述)一个函数,把多个代码文件(如a.c;b.c;…)中的函数,声明在这个文件中,以便于重用 、防止定义的冲突.
三,怎么用?
定义: 新建一个以.h结尾的文件,把需要用到的函数的声名直接放在里面.
引用: 自定义的头文件:#include “头文件名.h”
编译器类库里的头文件:#include <头文件名.h>
四,什么时候用?
当程序需要由多个c文件组成时.
五,有什么特点?
1.在头文件中仅做声名,不做具体实现
2.在头文件有声名只能确保编译成功成.o文件;但不确保能链接成功.
3.自定义的头文件引用时必须要有路径.
一,是什么?
是C语言中的一个预处理指令.
二,有什么用?
用于把一个文件的内容拷贝到这行命令所在的位置.
三,怎么用?
引用: 自定义的文件:#include “文件路径和名称”
编译器类库里的文件:#include <文件名>
四,什么时候用?
当程序需要用到别的文件时.
二进制--计算机语言
十进制--日常用的
代码表示: 二进制:0b或者0B开头 八进制:0开头 十进制:直接写 十六进制:0x或0X开头(最大F)
2.进制的打印输出:
%o:表示输出不带符号八进制整数
%x:表示输出不带符号十六进制整数
%d:表示输出有符号十进制整数
%u:表示输出不带符号十进制整数
注意:
1.二进与十进制互转:
2.二进制与八进制互转:
每3个2进制表示一个8进制:因为0b111==07 (8进制每位最大是7)
3.二进制与十六进制互转:
每4个2进制表示一个16进制:因为à0b1111==0xF (16进制最大是F)
注意:
10进制à2进制--->8进制或16进制 8进制--->2进制----->10进制或16进制
一.基本数据类型取值范围---超出取值范围数据会定义失败.
一,是什么?
是直接对整数在内存中的二进制位进行操作的方法(只能操作整形数据)
二,有什么用?
直接通过操作二进制的位来实现运算,高效
三,怎么用?
&与运算:对应两个二进位均为1时,结果位才为1,否则为0。(有假为假==0)
| 或运算:对应的两个二进位有一个为1时,结果位就为1,否则为0。(有真为真==1)
^ 异或运算:对应的二进位不同时为1,否则为0。(不同为真==1,相同为假==0)
注意:1.相同整数相^的结果是0.2.一个数^另一数两次结果不变3.整数相^跟顺序无关
~ 取反运算:对整数的各二进位进行取反,包括符号位(0变1,1变0,真假互换)
<< 左移:把整数的各二进位全部左移n位,高位丢弃(包括符号位),低位补0。
左移n位其实就是乘以2的n次方(但移动后符号位变化除外,符号位改变则正负改变)
>> 右移:把整数的各二进位全部右移n位,符号位不变。高位的空缺是正数补0;
是负数高位是补0或是补1 取决于编译系统的规定;右移n位其实就是除以2的n次方
“ + ”加法运算符 “ - ”减法运算符 “ * ” 乘法运算符 “ / ”除法运算符 “ % ” 取余运算符.
“ = ”赋值运算符 “ += ”加等于运算符 “ -= ”减等于运算符
“ ++ ” 自增运算符 “ - - ”自减运算符
“ == ” “ > ” “ < ” “ >= ” “ <= ” “!=”
用法:对数据进行比较,看是否成立,条件成立=真(1),条件不成立=假(0).
int b=1!=2>3<4; 等效于:2>3为假=0. 0<4为真=1, 1!=1为假=0.所以最终结果=0;
“ ||”或 “ && ”与 “ ! ”非
用法:对于多个表达式进行并列真假判断
注意:
定义:
<真假判断表达式1>?<表达式2>:<表达式3>;
如: 1+2>4?2+2:3+4; 这个运算过程为:
1+2=3, 3>4为假.则运行3+4这个表达式.所以最终结果为7.
是指编程中用来判定所给定的条件是否满足,根据判定的结果(真或假)决定执行给出的两种操作其中的一个
1.if(){} 2.if(){}else{} 3. if(){}else if(){} 4.if(){}else if(){}else{} 5.if() ;
注意:
switch(表达式){ case 常量表达式1: 语句1;break;… case…;default: 语句n;}
注意:
是指编程循环语句,当满足条件时进入循环,循环判断,直到不满足条件跳出循环
根据条件反复执行一段代码的时候用
while(<条件>) {<语句>}; do {<语句>} while(<条件>);
for( ; ; ){ }里面是3个语句,两个分号。
第一个语句是开始前执行,
第二个语句是判断真假,如果真,就执行后面(大括号内)的代码。
第三个语句是每次执行完毕后执行
注意:
一,是什么?
是一个替换代码的预处理指令
二,有什么用?
可以在编译之前进行代码替换.
三,怎么用?
开始替换: #define 被替换内容 替换成的内容
如: #define kLength 6 表示从这行开始下面所有代码中的kLength 替换成6
结束替换: #undef 被替换内容 如: #undef kLength 表示到一行, 宏定义失效
四,什么时候用?
当需要用一些重复性代码或简单的函数运算时,可以用宏定义.提高效率
五,有什么特点?
1.命名尽量以大写或小写k开头.便于区分.(规范)
2.被双引号的引起来的不会被替换
3.宏定义只会做代码替换,不会关注任何逻辑,容易出现优先级错误(加括号解决).
4.替换可以设置作用域.如果不设置,作用域则是这行代码出现到代码的最后一行.
一,是什么?
是一个根据条件编译代码的预处理指令
二,有什么用?
可以让一段代码只在满足条件才编译.提高编译效率
三,怎么用?
通用: #if 条件表达式 #elif 条件表达式 #else
与宏定义相关: #ifdef 宏名 表示定义了宏 #ifndef 宏名 表示没有定义宏
#endif 结束条件编译.注意一定要加.
四,什么时候用?
当一些代码只需要在一定条件下编译时.
五,有什么特点?
1.条件编译不能访问需要编译后才能执行的代码.
2.条件编译不需要用大括号,所以必须加上结束标识,否则涵盖下面的所有代码
3.条件编译一般跟宏定义配合使用,防止重复包含及交叉包含
一,是什么?
是对文件或文件内容的输入(读)与输出(写). 文件操作的函数在<stdio.h>中声名.
二,怎么用?
1.打开一个文件并确定操作的方式:fopen(“文件”,”打开方式”);
函数会返回一个文件的指针(即结构体的指针).FILE *
2.开始操作:读或写. 常用的文件读写函数有三类:
字符读写函数:char c=fgetc(文件指针)读和fputc(字符,文件指针)写 ;
字符串读写函数:fgets(字符缓存,数量,文件指针)读和fputs(字符缓存,文件指针)写;
数据块(二进制)读写函数:fread(数据容器,单个数据字节数,总数,文件指针)读
fwrite(数据容器,单个数据字节数,总数,文件指针)写;
3.操作完成,关闭文件:fclose(文件的指针)
三,有什么特点?
1.打开文件的模式限定操作的方式.
2.打开操作文件后一定要关闭文件,否则容易引起内存泄漏.
3.输入与输出是相对于操作者而言.
标签:
原文地址:http://www.cnblogs.com/lk-ios/p/4966479.html