黑马程序员_C语言的一些总结

来源:互联网 发布:驾驭大数据 百度云 编辑:程序博客网 时间:2024/05/16 14:43
---------------------- ASP.Net+Unity开发、.Net培训、期待与您交流! ----------------------

C语言总结

通过最开始的c语言学习,我渐渐了解编程是什么回事。编程不是你懂得语法就好,最重要的还是多敲,多实践,多用printf()函数判断中间过程是否正确。许多东西要经过翻书,上网查阅,搜索才会知道下一步要怎么编,当遇到一小点错误运行不出来,便会焦躁不安,虽然没有自暴自弃或者抱怨题目有些变态,可是会自信心受挫,想要攻破困难的心情会越来越处于主导地位,以下是我对C语言的总结:

 

一、常量

1.数字常量   

比如13,,6

2.字符常量 

普通字符常量:用单引号把一个字符括起来,如‟A‟,‟@‟

3.字符串常量

对双引号把一个字符序列括起来,如“ABCef”

 

二、标识符

命名规则 

以数字,字母,下划线这三类字符组成,但只能以字母或下划线开头,而不能也数字开头,另外不能将关键字做为标识符。(变量名,函数名,符号常量名全都是标识符)

 

三、 变量 

1. 变量的定义格式 

类型名 变量名;  

2.类型名

int 整型,long 长整型: 用于存放整数,只是数值范围不同 float单精度浮点型 double 双精度浮点型:用于存放实数,数值范围,精度不同 char字符型:用于存放字符  

3.自增自减运算

变量++,++变量,变量--,--变量  使变量的值自增1或自减1等价于 变量=变量+1  变量=变量-1

 

四、表达式

强制类型转换

格式: (类型名) 表达式。将后跟的表达式的值的数据类型转换为与圆括号内的类型名一致的类型。注意类型名一定要用()括起来。

赋值表达式

1.赋值运算符:=,+=,-=,*=,/=,%=

2.赋值表达式:变量=表达式,如x=3+6,x+=6-9,x+=x*=3+4 注意等号左边只能是变量

关系表达式

1.关系运算符:< , > ,<=, >=, ==(等于), !=(不等于)

2.由关系运算符加上运算对象构成关系表达式,如3>=4,2==a

3.值:满足相应运算符所指定的关系的值为1,否则为0

逻辑表达式

1.逻辑运算符:&&(且) , ||(或) , !(非)

2.由逻辑运算符加上运算对象构成逻辑表达式,如3&&4,x||!y

3.值:满足相应运算符所指定的关系的值为1,否则为0

 

五、输入输出函数

1.scanf(“格式控制串”,变量地址表列);

1.格式控制串可控制截取用户输入的前几个字符给变量

2.参数给的是地址,即要么是&+变量名或数组元素名的形式,要么就是一个数组名或指针变量名,如int *p,a; p=&a; scanf(“%d”,p);

3.若其格式控制串内各格式符用“,”隔开如scanf(“%d,%c,%d”,&a,&ch,&b);那输入时也要用逗号隔开,如此例输入时应:5,*,9

 

2.printf(“格式控制串”,输出项表列);

常用格式符汇总:

1.%d:输入输出整型数据,%ld:输入输出长整型数据

2.%c:输入输出字符型数据

3.%f:输出单(双)精度浮点型数据,输入单精度型数据。%lf:输入双精度型数据

4.%s:输入输出一个字符串,用printf输出字符串时,输出项书写时可为字符串常量,或字符数组名。如printf(“%s”,”hello”);或char str[10]=”hello”; printf(“%s”,str);

5.%u:输入输出无符号整型,%o:输入输出八进制数,             

%x:输入输出十六进制数。

 

六、C程序的基本结构

 

void main()

{  声明部分:用来定义变量和声明自定义函数的原型,需以“;”结尾,如int x;

   执行语句部分:第六点里介绍的各种语句,如x=3;printf(“%d”,x);

}

main函数外可写自定义函数。如

int max()

{

  return 0;

}

1、选择结构语句

选择语句可以分为if,else和switch语句,if语句是可是完全代替switch语句的,但是switch语句的存在是看需要而定,一般情况下,纯粹比较数字或字符,建议使用switch,因为它只会在一开始的switch括号中取出变量值一次,然后将这个值与下面所设定的case比较,但如果使用if,每次遇到条件式时,都要取出变量值,效率的差异就在这儿。其他情况还是建议使用if语句会更好解决问题。

 

 

2、循环结构

for循环语句

for(表达式1;表达式2;表达式3) 循环体语句

语句执行过程:

计算表达式1

判断表达式2的值是否为0,若为0,语句执行结束,若不为0,进入步骤3

执行循环体语句(需注意的是循环体语句只能有一个语句,若要包含多个语句要用一对{}括起来,构成一条复合语句,此处也不要随便加上“ ; ”,因一个“;”可构成一条空语句,这会使得后面真正的循环体语句不属于for循环语句的部分)。进入步骤4

计算表达式3,然后重新进入步骤2

while(表达式) 循环体语句

执行过程:

判断表达式的值是否为非0,若是进入步骤2,否则结束语句执行。

执行循环体语句,重新回到步骤1。

 

七、数组(用内存的方式去理解数组有利于以后指针的学习)

定义格式:数据类型  数组名[整型常量];如 int a[10];定义了一个整型数组,数组名为a,这个数组含有10个元素。

引用数组元素: 格式:数组名[下标]   切记下标值从0开始。下标可为常量,表达式,变量等

初始化:数据类型   数组名[整型常量]={数据表列};将数据表列的各个值依次赋值给数组的各个元素。

遍历数组元素

数组定义后,我们不能对数组进行整体的操作,如int a[10];我们就可以借助于一个for循环来控制下标的变化从而对数组的各个元素进行赋值

for(i=0;i<10;i++) a[i]=3;

当然这只是用for循环遍历数组各元素的最简单的例子,一般考试考的是找出数组元素的某种特性的极值,比如最大值,最小值,或对数组各元素进行排序,这时我们就可以使用for循环来遍历数组的各元素,然后在当前循环中得到一个元素再对其进行处理。

整型数组

int a[10]; 整型数组里的各个元素存放的是整数。a[3]=3;

字符型数组

char str[20];字符型数组里的各个元素存放的是字符。   str[3]=’A’;

 

八、字符串函数

strlen(字符数组名或字符指针变量);字符串测长函数

char str[20]=”hello world!”; 

int len;len=strlen(str);得出的结果是len的值为12

strcat(字符串1的地址,字符串2的地址);

将字符串2的内容连接到字符串1的尾部。

char str1[20]=”ABC”,str2[20]=”xyz”;

strcat(str1,str2);

则程序运行的结果是str1内存放的字符串变为ABCxyz,当然str2存放的字符串还是xyz。

strcmp(字符串1的地址,字符串2的地址);

比较串1和串2哪个比较大。比较大小的依据是,两个字符串从左往右相应位置上第一个不相等的字符ASCII码值之差。

char str1[20]=”ABCE”,str2[20]=”ABDE”;

int i;

i=strcmp (str1,str2);

第一个不相等的字符为str1的‘C’和str2的‘D’,而二者相差-1,故-1做为strcmp函数执行的结果返回到被调用的位置,该位置位于赋值表达式内,故将其值赋值给i,即此时i的值就是-1.

strcpy(字符串1的地址,字符串2的地址);

将字符串2的内容复制到字符串1内。

char str1[20]=”ABC”,str2[20]=”xyz”;

strcpy(str1,str2);此时str1的内容为”xyz”,当然str2的内容没变

strcpy(str1,”uvw”);此时str1的内容又变成了“uvw“。

 

九、函数

函数定义

函数类型  函数名( 形式参数列表 )

 {

       内部变量定义和声明部分

              执行语句

 }

如:

int  max (int  x , int  y )

{  int  z ;

    z= x > y ? x : y ;

    return  ( z ) ;

}

注意点:

1.函数类型是指返回值的类型,即要与return语句后跟的表达式的值的类型一致。若函数类型为void则说明该函数无返回值,即函数体里不能出现return 语句。

2.形式参数列表里定义的变量要记得给它们指定类型,而且如果同时要定义多个,应在每个前面都分别指定类型名,而不能写成int x,y;

3.函数体里能写的语句跟main函数一样,在开头可定义所需要的变量,后面跟上一堆执行语句。

 

函数调用流程

以上面的函数为例,在main函数进行调用:

void main()

{ int a,b,c;

 scanf(“%d%d”,&a,&b);

 printf(“%d”,max(a,b));或 c=max(a,b);printf(“%d”,c)以上两种方法都会在屏幕中打印出a,b间的较大值。

调用函数的格式函数名(实际参数列表);调用的时候像什么函数类型,形式参数的类型就不要加上去了。max(a,b)中max就是函数名,写上变量名a,b是实际参数列表,执行这个调用语句时,会先把a,b的值给相应位置的形式参数即执行了x=a,y=b这样的操作,然后开始执行max函数的函数体的语句。当max函数体里执行到一个return语句时,则max函数结束执行,将return后的表达式的值返回给main函数调用max函数的那个位置,即若上面a=3,b=5则max(a,b)return后的表达式的值应该是5也就是说执行完max后把5返回到调用max的位置可看成printf(“%d”,5);或另一种解法的c=5。

}

 

十、指针(C语言重点/精华)

指针变量的声明: 类型名 * 指针变量名;

 

通过指针变量访问它所指向的普通变量的值

先将普通变量的地址赋值给指针变量,再通过指针运算符* 得到普通变量的值。

int *p,x,y;

x=3;

p=&x;

则printf(“%d”,*p);会打印出3即x的值

y=*p;则y的值变为3

*p=5;则x的值变为5

 

指针变量加上(减去)一个位移的效果

若指针变量存入的是数组元素的地址,则其加一减一得到的是那个数组元素下一个或前一个元素的地址。

int a[10]; p=&a[3];

*p得到的是a[3]的值。

若p++;此时p存放的是a[4]的地址&a[4]; *p得到的就是a[4]的值。

或p--;此时p存放的是a[2]的地址&a[2],*p得到的就是a[2]的值。

判断是否合法访问数组元素:若是指针法访问,判断指针后跟的是否地址;若是下标法访问,判断下标有无越界。

 

函数指针:函数名即为函数的地址(指针)

 

函数指针变量的定义:类型名 (*变量名) (形参列表);如 int (*p)();

 

赋值:指针变量=函数名;设有个函数其函数名为max,则要将该函数的地址给p的话只要执行如下语句即可 p = max;

 

指针数组:指针数组的数组元素都是指针变量,是用来存放变量的地址的,定义格式为类型名 * 变量名[数组长度]; 如int * p[10];

 

指向指针的指针:指针变量也是一种变量,故在内存中也有对应的一个地址,而要存放指针变量的地址,就要求助于用来存放指针变量的地址的指针变量,定义格式 类型名 ** 变量名;如 int*p1; int **p2; int a=3;可进行赋值p1=&a;p2=&p1; 则a 、*p1和 **p2的值都是3.

 

十一、宏定义

 

无参宏定义 #define  标识符  值  

定义后,出现所定义的标识符的地方都将以定义时指定的值来代替。

#define M  2+3

main()

{ int x;

  x=M*M;  则x的值为2+3*2+3=11若想得到的结果是(2+3)*(2+3)则定义时也写成这样#define M (2+3)

}

注意#define、标识符、值之间都要用空格隔开,且宏定义结尾不需加分号

带参宏定义  #define 标识符(参数表)  值

#define  S(x,y) x*y

main( )

{ int a=3,b=4,c=5,d=6;

   printf("a*b=%d\n", S(a,b)); 此时会打印出 a*b=12

   printf("a+b*c+d=%d\n" , S(a+b,c+d)); 此时会打印出a+b*c+d=29,带参宏定义执行时是将a+b这样一个表达式代替x,c+d这样一个表达式代替y,所以S(a+b,c+d)进行的是a+b*c+d的运算,而不是将a+b的值给x,c+d的值给y然后再做x*y,这点跟函数调用传递参数是不一样的。

}

 

自定义类型名typedef:对已存在的类型名取一个外号。

基本格式:typedef  原类型名  新类型名;

typedef int INTEGER; 则int a,b;等价于INTEGER a,b;

typedef int  NUM[10]; 则 int a[10];等价于 NUM a; a即为一个有10个元素的数组的数组名。

typedef int * INTEGER; 则int *a,*b;等价于INTEGERa,b;

 

十二、结构体,共用体,枚举类型

1、结构体

结构体其实也是一种数据类型,只是这个结构体里面的成员变量类型是多样的

结构体类型的定义及变量的定义

struct 结构体名

 {类型 成员1;

  类型 成员2;

  ……

  类型 成员n;

 }变量名;  // 这里变量名可写可不写

struct student

{ long  num;

char name[10];

int score[4];

}st1; //定义类型时同时定义变量

struct student st2; // 定义类型后,用类型名定义变量

还有一种

struct

{ long num;

char name[10];

int score[4];

}st3;  // 不给类型名,直接定义变量

结构体变量所占字节数:各成员各占字节数之和,如以上st1,st2,st3的字节数皆为10+20+2*4=38

结构体变量初始化:struct student a={20030001, "张三",70,75,80,85};

结构体数组定义及初始化:

struct student a[3]={{20030001,"zhang",89,90,91,92},

           {20030002,"liu",68,69,70,71},

            {20030003,"li",57,58,59,60}};

结构体变量成员的访问

结构体变量名. 成员名 如st1.num

使用结构体类型的指针:

(*结构体指针名) . 成员   或    结构体指针名–>成员名

struct student *st; st=&st1;  st->num 或(*st).num

 

 

2、枚举类型

枚举类型的定义:                                                 enum 枚举名{枚举元素名1,枚举元素名2,…,枚举元素名n};

枚举元素的值:
默认值分别为0、1、…、n-1。枚举元素的值也可在定义时重指定,对于没有指定值的元素,按顺序加1

如enumweekday{sun=7,mon=1,tue,wend,thur,fri,sat};则sun值为7,mon值为1,tue值为2,wend值为3,thur值为4,fri值为5,sat值为6


 

 

---------------------- ASP.Net+Unity开发、.Net培训、期待与您交流! ----------------------详细请查看:www.itheima.com
0 0
原创粉丝点击