码迷,mamicode.com
首页 > 编程语言 > 详细

C语言学习总结

时间:2015-11-15 20:32:38      阅读:474      评论:0      收藏:0      [点我收藏+]

标签:

一、c语言的基本概念

                                                                      丹尼斯 里奇

1 是一个面向过程的计算机高级语言--不需要任何运行环境便能运行的程序语言;

2 标准:目前是C11      (K&R C—>ANSI C / C89标准—>C99标准——>C11标准)

 

 

二、C程序概念

1、C程序结构:有很多的函数构成,main函数为主函数-程序执行入口;

技术分享

 

2、C语言执行过程:程序编写出来通过编译器编译连接后生成机器语言,计算机才可以执行。 目前用的Clang编译器是作者: 克里斯·拉特纳(英语:Chris Lattner,1978年)

技术分享

C语言知识点

注释            关键字           标识符

数据类型      常量              变量

基本运算      流程控制        函数进制

内存分析      数组              字符串

指针            变量类型        结构体

枚举            预处理指令     宏定义

条件编译      typedef        文件操作

 

三、基本语法总结:

一、 注释----对代码进行解释说明,辅助调试代码,不参加编译

用法:

1.单行注释 //想注释的内容 

2.多行注释:  /*想注释的内容*/

 

二、标示符--自定义的一些名字

用法:

1.由26个英文字母的大小写、10个阿拉伯数字0~9、下划线_,$组成;

注意:

  • 1.不能以数字开头
  • 2不能与关键字重名
  • 3.严格区分大小写
  • 4.起名要有意义
  • 5.便于识别(驼峰命名).

三、数据类型

技术分享

 

四、常量--是一些固定的数据 

有四大类:整型(int)    浮点型(单精度(float)和双精度(double))    字符型char   字符串型

特点:  数据不会被改变

 

五、变量--表示一个需要经常改变或者不确定的数据

变量类型 变量名; 如:int num;

1.赋值 num=1; 2.修改 num=2;

特点:

  • 1.创建一个变量相当于在内存中占用了一块空间
  • 2.这个空间的大小是固定的,但里面的数据可以改变
  • 3.同一个作用域内不能有相同的变量名.
  • 4.初始化时创建,在函数作用域执行完后失效,且内存空间释放.

全局变量

一,是什么?

在所有函数外部定义的变量,称为全局变量。

二,有什么用?

用于存储一个需要长期存于内存,并需要改变的变量.

三,怎么用?

 跟普通变量没区别,只在位置在在所有函数之外.

四,什么时候用? 

当需要定义一个随程序一直存于内存中,并可以被其它函数共享的变量时候.

五,有什么特点?

 1.生命生期跟随程序.程序启动创建,程序退出其才会销毁

 2.作用域是其所在位置之下的所有函数,都可以共享并改变.

 3.变量的使用遵循就近原则如果函数内有同名变量,那么用函数自已的.

 4.如果没有初始化赋值,默认值是0;

 

printf()函数--输出

常用格式化字符串:%d 整数    %f 浮点数  %c 单个字符  %s字符串   %p 指针的值

定义:printf(“<格式化字符串>”, <参量表>);如printf("a=%d\n",123);

scanf()函数--输入

定义:scanf (“格式化字符串”, 变量地址);如 int a;int b;  scanf(“%d,%d",&a,&b);

六、转义字符

技术分享

七、关键字 32个

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

 

typedef

 

一,是什么?

是一个C语言的一个关键字.

 二,有什么用?

可以给一个数据类型取一个别名,方便使用.

三,怎么用?

定义: typedef  类型 别名;

 如:   typedef  long int  Lint; 表示给一个long int 类型取一个别名为Lint

则:   long int a =5;与Lint  a=5;二者等效

四,什么时候用? 

当希望给一个类型取一个别名时(类型比较复杂等),可以用,方便理解调用.

五,有什么特点?

1.定义位置没有限制,函数内外都可以.

2.作用域为定义位置开始至所处作用域结束.类似于变量

3.可以用于任意数据类型.

4.别名具有数据类型的含义,这是跟宏定义最大区别.

 

static与extern

 

一,是什么?

是C语言的关键字.

 

二,有什么用?

控制一个变量或函数的作用域.

 

三,怎么用?

修饰函数:static 返回值 函数名(){};表示函数为内部函数只能被本文件访问.

extern 返回值 函数名(){};表示函数为外部部函数能被程序的所有文件访问.(默认)

修饰全局变量: static:表示变量只能被当前文件访问. extern:所有文件共享.(默认)

修饰局部变量: static:表示延长变量生命周期至程序结束. extern:声名一个全局变量.

 

四,有什么特点?

1.外部函数不同文件中也不能重名,但内部函数可以

2.同类型全局变量可以重复定义,但在内存中只有一份.

3.可以在函数内声名一个全局变量.但要使用必须在函数外定义. extern只是声名.

4.static修饰定义局部变量,则这个局部变量生命周期延长至程序结束.但作用域不变.

 

auto与const

一, 是什么?

是C语言的关键字.

 

二,有什么用?

auto: 用于定义一个能自动回收的临时变量.这个变量在作用域内用完后会自动销毁.

canst:用于定义一个常量,这个常量在常量区,且在内存中仅有一份.且不能改变.

 

三,怎么用?

auto  数据类型 变量名;(默认所有局部变量都是被这个修饰,可以省略)

注意: 1. static修饰的除外.  2.全局变量除外;

 

canst 数据类型 变量名=值;

注意:一但定义,值就固定不能被改变.

如:

  const  int a;

 

goto

一, 是什么?

是C语言的关键字.

 

二,有什么用?

让指令能够不受条件跨越执行.简化代码

 

三,怎么用?

int a=0;

if(a==0){

      goto heima;

}

printf(“itcast\n”);//这行不会执行

heima:printf("heima\n");//直接跳到这里执行

 

三,什么时候用?

需要不受限制进行指令跳转时.(如:跳出多层循环嵌套)

 

register与volatile 

一, 是什么?

是C语言的关键字.

 

二,有什么用?

register 表示让程序优先把这个数据存在寄存器中.

volatile 表示让编译器不要去优化代码,不能用缓存,每次使用都必须去内存中获取.

 

三,怎么用?

修饰变量:

  register  数据类型 变量名;

  volatile   数据类型 变量名;

 

四,什么时候用?

register :如果一个变量使用相当频繁且占用内存又不是很大.可以使用.

  全局变量与加了static局部变量除外.

volatile : 如果需要让计算机严格按写的指令指执行,且能关注变量每一次值的变化,

  这个时候可以使用,则编译器不会对执行指令作优化.

 

 

数组

一,是什么?

是用来存储一组数据的容器.

二,有什么用?

用于把同一类型的一组数据统一管理起来.

三,怎么用?

定义: 数据类型 数组名[长度(数量)] ;初始化:类型 数组名[(长度)]:={元素1,元素2,…}

赋值:数组名[角标(索引)]=值;   使用:数组名[角标];如int a=arr[0];

四,什么时候用? 

当需要管理一组有关联的数据时.

五,有什么特点?

  • 1.数组必须要定义长度(正整数),定义时可初始化(长度必须是常量)或之后单独初始化.
  • 2.数组是有序的.每个数据都有角标.从0开始分配.角标不能>=数组长度.类型一致.
  • 3.数组有地址(数组名),里面的元素也有地址.数组当参数时(长度可省)传递的是地址.
  • 4.数组当参数传递时是指针类型.所以如果需要用数组长度要额外传递.

二位数组

一,是什么?

是用来存储一组数组的容器.

二,有什么用?

用于把同一类型的一组数组统一管理起来.

三,怎么用?

定义:  类型 数组名[数组的数量][子数组的长度] ;

初始化:类型 数组名[数组的数量][子数组的长度] :={{数组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表示一个指针变量名)

  • 1.指针本身也有地址.指针定义之后,自身地址不变,但里面的存的地址可以变化.
  • 2. &p表示指针自身地址,而p表示指针存的地址 *p表示指针所存地址的内存空间.
  • 3.指针不初始化赋值不要使用.未赋值前地址是随机的.未赋值不可以用*p.
  • 4.*修饰什么,就表示是什么的指针.判断原则:先确定变量的类型.(根据符号优先级)
  • 5.指针是什么类型的,就应该存什么类型的地址.否则*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,….) 

 

注意:

  • 1.返回值类型不定义默认是int.如果不需要具体返回值类型用void(return可以省略).
  • 2.是否要定义参数看是否有未知内容参与运算,调用时参数必须对应.参数传递的是值. 

 

头文件

一,是什么?

是C语言中以.h结尾的文件,如stdio.h .

二,有什么用?

用于声名(描述)一个函数,把多个代码文件(如a.c;b.c;…)中的函数,声明在这个文件中,以便于重用 、防止定义的冲突.

三,怎么用?

定义:   新建一个以.h结尾的文件,把需要用到的函数的声名直接放在里面.

引用:   自定义的头文件:#include  “头文件名.h”

     编译器类库里的头文件:#include  <头文件名.h>

四,什么时候用? 

当程序需要由多个c文件组成时.

五,有什么特点?

1.在头文件中仅做声名,不做具体实现

 2.在头文件有声名只能确保编译成功成.o文件;但不确保能链接成功.

3.自定义的头文件引用时必须要有路径.

 

#include的使用

一,是什么?

是C语言中的一个预处理指令.

二,有什么用?

用于把一个文件的内容拷贝到这行命令所在的位置.

三,怎么用?

引用:  自定义的文件:#include  “文件路径和名称”

     编译器类库里的文件:#include  <文件名>

四,什么时候用? 

当程序需要用到别的文件时.

 

进制及内存分析

 

二进制--计算机语言

十进制--日常用的

 

代码表示: 二进制:0b或者0B开头 八进制:0开头 十进制:直接写 十六进制:0x或0X开头(最大F)

2.进制的打印输出:

%o:表示输出不带符号八进制整数

%x:表示输出不带符号十六进制整数

%d:表示输出有符号十进制整数

%u:表示输出不带符号十进制整数

注意:

  • 二进制不可以直接输出.
  • 有符号与无符号区别:有符号可以有负数表现(如: - 2)

 

进制互换 

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.算术运算

“ + ”加法运算符  “ - ”减法运算符  “ * ” 乘法运算符  “ / ”除法运算符  “ % ” 取余运算符.

  • 1.不同数据类型精度不一样.double>float>int.  取余运算符只能整数.+1:正数 -1:负数
  • 2.若用高精度向低精度变量赋值.会丢失精度.如:int a=1.8;那么a值是1.(非四舍五入)
  • 3.运算优先级是.从左到右 但: * = / = % > + = -  如果要人为改变则加().
  • 4.运算时两个数据精度不一样,会自动类型转换,且是低精度向高精度转换.
  • 5.同精度运算只能得到同精度的结果.如果需要提高精度,需要强制类型转换.

 

2.赋值运算

“ = ”赋值运算符  “ += ”加等于运算符  “ -= ”减等于运算符  

“ ++ ” 自增运算符  “ - - ”自减运算符

  • 1.变量才能自我变化,如自增或自减,但常量不能.
  • 2. ++a,与a++,对a本身没有区别,但是参与其它运算时,a++这个整体的值没有变化.

3.关系运算

“ == ”    “ > ”    “ < ”   “ >= ”    “ <= ”     “!=”

用法:对数据进行比较,看是否成立,条件成立=真(1),条件不成立=假(0).

  • 1.关系运算符运算结果是一个int值.0或1.
  • 2.优先级:>,<,>=,<=,优先级相等, 但大于==和!=.同时==与!=优先级相等.
  • 3.如果优先级相同的两个运算,先后顺序看结合律(结合律指要么从左往右运算,要么从右往左运算),关系运算符结合律是从左往右,即:先看优先级,再看结合律.如下:

    int b=1!=2>3<4; 等效于:2>3为假=0. 0<4为真=1, 1!=1为假=0.所以最终结果=0;

4.逻辑运算

“ ||”或     “ && ”与     “ ! ”非

用法:对于多个表达式进行并列真假判断

  1. ||只要有一边的表达式为真,则结果为真1,两边都不成立,则结果为假0.
  2. &&必须两边全部为真才为真,只要有一边的表达式为假,结果为假.
  3. !则是取当前结果的反面.真假调换.

注意:

  • 1.所有数据都有真假值.0为假,其它的数都为真(规定).   结合律:从左往右执行,
  • 2. 如果||表达式左边表达式已经为真,则右边不执行.而&&只要左边为假右边不执行.
  • 3.优先级顺序为:小括号() > 负号( -) > ! > 算术运算符 > 关系运算符 > && > ||

5.三目运算符--(一般不用)

定义:

<真假判断表达式1>?<表达式2>:<表达式3>;

如: 1+2>4?2+2:3+4; 这个运算过程为:

 1+2=3, 3>4为假.则运行3+4这个表达式.所以最终结果为7.

 

技术分享

 

 

流程控制

1.选择语句

是指编程中用来判定所给定的条件是否满足,根据判定的结果(真或假)决定执行给出的两种操作其中的一个

if语句用法:

1.if(){}  2.if(){}else{}  3. if(){}else if(){}     4.if(){}else if(){}else{}   5.if() ;

注意:

  • 1.一次if语句只能执行给出的所有操作中的一个.
  • 2.if();这种用法时if语句只有紧跟后面一句有效.(读到下一个;号结束).且不能定义变量
  • 3.除了if();这种用法,所有的if()与{}之间不能有;号
  • 4.if(条件判断){},里面的条件判断如果是与常量的等于判断,则常量写在前面(建议);

 

swich语句用法:--一般用于判断值是整数用

switch(表达式){ case 常量表达式1: 语句1;break;… case…;default:  语句n;}

注意:

  • 1.条件结果只能是整数,而case只能是整型常量.注意:case ‘a’;
  • 2.break 可有可无,有则执行完跳出,没有则继续执行,直到遇到下一个break或执行完.
  • 3.default可有可无,有则如果条件都不满足,会执行这句,无则条件都不满足,执行结束.
  • 4.case下面要定义变量必须加{}.且case后的常量值不能重复
  • 5.switch语句可以全部用if语句替代.但if语句不能全用switch替代.

 

2.循环语句

是指编程循环语句,当满足条件时进入循环,循环判断,直到不满足条件跳出循环

根据条件反复执行一段代码的时候用

while语句用法:

while(<条件>) {<语句>};          do {<语句>} while(<条件>); 

 

for语句用法:

for( ; ; ){ }里面是3个语句,两个分号。

第一个语句是开始前执行,

第二个语句是判断真假,如果真,就执行后面(大括号内)的代码。

第三个语句是每次执行完毕后执行 

注意:

  • 1.如果碰到continue,则跳出本次循环继续下一次判断,如果条件成立继续执行循环.
  • 2.如果碰到break无论条件满足与否,循环立刻结束.
  • 3.continue与break跳出的都是当前所在的循环作用域.如果外层有循环,不受影响.
  • 4.do while至少执行一次.而while不一定.

 

 

预处理指令

1.宏定义

一,是什么?

是一个替换代码的预处理指令

二,有什么用?

可以在编译之前进行代码替换.

三,怎么用?

开始替换: #define 被替换内容  替换成的内容

如: #define kLength 6 表示从这行开始下面所有代码中的kLength 替换成6

结束替换: #undef 被替换内容 如: #undef  kLength   表示到一行, 宏定义失效

四,什么时候用? 

当需要用一些重复性代码或简单的函数运算时,可以用宏定义.提高效率

五,有什么特点?

1.命名尽量以大写或小写k开头.便于区分.(规范)

2.被双引号的引起来的不会被替换

3.宏定义只会做代码替换,不会关注任何逻辑,容易出现优先级错误(加括号解决).

4.替换可以设置作用域.如果不设置,作用域则是这行代码出现到代码的最后一行.

 

2.条件编译

一,是什么?

是一个根据条件编译代码的预处理指令

二,有什么用?

可以让一段代码只在满足条件才编译.提高编译效率

三,怎么用?

通用:  #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.输入与输出是相对于操作者而言.

技术分享 

  

 

 

 

 

 

 

 

 

C语言学习总结

标签:

原文地址:http://www.cnblogs.com/lk-ios/p/4966479.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!