C语言学习

板块一:数据类型

Q:什么是数据类型?

高级语言通常将能处理的数据分成若干类,这些类就是数据类型。

Q:为什么要划分数据类型?

不同类型数据能执行的运算不同。

一.整型数据及其所占字节(VC++)

int 4个字节

short int 2个字节

long int 8个字节

unsigned int 4个字节

unsigned short int 2个字节

unsinged long int 4个字节

二.字符型

char 1个字节

float 4个字节

double 双精度实型 8个字节

long double 8个字节

三.sizeof运算符

功能:获取变量的数据类型和所占内存大小(字节数)

格式:sizeof 表达式

sizeof(数据类型名或表达式)

eg:

unsigned long(a);

sizeof(a)==4;

四.存储长度

五.整数的数值溢出(数据超出所能表达的范围)

0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1进行加1运算

1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 程序运行结果:-32768

六.浮点数--科学计数法

阶码(指数部分)尾数(小数部分)

采用以2为底的科学计数法存储,N=数符xR^ExM(数符0为负一为正,M为尾数,E为阶码,R为基数,小数点不占位置,尾数中的1不储存,只存储小数部分。)

float单精度:6-7位有效数字

数符阶码                   尾数

                          1位                     8位                         23位

double双精度:16位有效数字

数符阶码                         尾数

                        1位                         11位                             52位

板块二:运算符,表达式和语句

一.运算符:运算符是描述各种操作的符号

1.分类:

算术运算符

关系运算符

逻辑运算符

位运算符

赋值运算符

2.表达式:由运算符连接起来的符合c语言语法的式子

算术表达式:由算数运算符连接起来的表达式

 3.任何运算符都有两个属性

优先级和结合性,规则如图上所示

4.整除问题:"/"是除法运算符,当两个整数相除时结果取整

若有一个为负数向0取整

eg:9/2=4

-9/2=-4

1/2=0

1.0/2=0.5

5.求余运算:只能作用于两个整数的运算,运算结果是两个整数的余数,结果为整数

如果被除数小于除数结果即为被除数

eg:9%2=1

-9%2=-1

9%-2=1

2%9=2

6.常用数学库函数

使用标准数学函数头文件要包括 #include <math.h>

7.表达式书写规则:

使用合法的C语言运算符

表达式必须书写在一行

使用圆括号改变表达式的运算顺序

 赋值运算符=

变量名=常量或表达式

自动类型转换

int——float 丢失小数部分

flaot——double 数值溢出或精度损失

float——long 整数的位数超过7位损失精度

eg:int a=12,b=8;

float x,y;

b=x=y=a+b;

表达式的值,x的值,b的值分别为多少

b的值为20,x的值为20.000000

复合赋值运算

复合赋值运算符

+=、-=、*=、/=、%=、<<=、>>=、&=、^=、|=

特点:简化程序书写

结合性从右至左

注意两个运算符之间不要有空格

 eg:int a=2;

a%=4-1;

a+=a*=a-=a*=3;等价于a=a+(a=a*(a=a-(a=a*3)))

结果a=0

板块三:循环:有规律的重复操作

c语言中的三种循环语句

1.while(当型循环先判断条件后执行语句)

 如图所示表达类型不限按其值为0或非0决定是否进行

i=1时i<=9进入循环,每次循环结束i自增

当程序进入第十次循环时i=10不满足i<=9的条件结束循环

2.do-while循环语句

(1)语句形式:do 语句

                          while(表达式)                特点:直到型循环 

                                                                               先执行语句后判断条件

 while循环当输入11时不满足i<=10的条件不进入循环输出0,do-while 当输入11时先执行s=s+5==5,i++后i==12不满足循环条件则退出循环输出5。

3.for循环:常用于循环次数确定的场合

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

三个表达式均可以省略但是';'不可省略

如图所示,求前一百项之和进行一百次循环

板块四:分支和跳转

1.if语句

if语句被称为分支语句选择语句,因为它相当于一个交叉点,程序需要在两条分支中选择一个执行。if语句的通用形式如下:

if(expression)

statement

2.if else语句

c还提供了if else形式,可以在两条语句之间作选择。if else语句的通用形式:

if(expression)

statement1

else

statement2

如果expression为真(非00,则执行statement1;如果expression为假或0,则执行else后面的statement2.statement1和statement2可以是一条简单语句或复合语句。c并不要求一定要缩进,但这是标准风格。缩进让根据测试条件的求值结果来判断执行哪部分语句一目了然 如果要在if和else之间执行多条语句,必须用花括号把这些语句括起来称为一个块。

3.else和if配对

  如果没有花括号,else与离它最近的if匹配,除非最近的if被花括号起来。

4.break语句

功能:终止包含该语句的最内层循环

5.continue语句:功能结束循环体的本次执行

 6.goto 语句

一般形式 goto 标号;

标号;语句;

功能:1.程序无条件跳到标号指定的位置继续执行

2.改变程序自上而下的执行顺序

3.常用于从内层循环体中跳到外层循环体外

语法说明 标号用标识符表示,即有字母、数字和下划线组成,且首字符必须为字母和下划线,不能用整数做标号

板块五: 函数

一、什么是函数:函数是构成c语言的程序的基本板块

函数是按规定格式书写的能完成特定功能的一段程序

函数可以根据需要与调用函数之间进行数据传递

函数之间地位平等可以互相调用也可以自身调用

二、函数的分类

标准库函数

自定义函数

三、函数的定义和调用

函数定义的一般形式

返回值类型 函数名(【参数表】)
{

函数体;

【return 表达式】}

函数的调用

一个函数暂时中断运行去执行另一个函数的过程

两种调用公式:

函数语句调用方式

函数表达式调用方式

一般形式:函数名(【实际参数表】);

通过函数调用语句调用函数,用于调用没有返回值的函数 

一般形式:变量名=函数表达式

函数有返回值,函数调用出现在一个赋值表达式中,要求函数带回一个确定的值参加表达式的运算

函数名(参数)

函数有返回值,函数调用当到一个函数调用语句中,作为另一个函数的参数

eg:printf("%d",Max(a,b));作为另一个函数调用的参数

m=f1(a,Max(b,c));作为另一个函数调用的参数

函数的返回

函数的返回值语句:

通过函数调用使主调函数得到一个确定的值

一般形式:return 表达式;

                或 return(表达式);

每个函数执行完后会返回调用它的地方

函数通过return语句向主调函数返回一个值

可以不返回任何内容

没有return也会自动返回

如果函数不是void类型而没有return语句则会带回一个不确定的值

若return语句中表达式类型与函数类型不一致以函数类型为主

函数原型

什么是函数原型

函数必须先定义后使用

当自定义函数被放在了主调函数背面就需要在函数调用之前加上函数的原型声明

申明格式:

函数类型 函数名(形参类型 【形参民】,...)

作用:

通知编译器函数的返回值类型,函数希望接受的参数个数、类型和顺序,为编译器检查函数调用语句是否合理提供依据。

函数声明的位置:

程序的数据说明部分(函数内或外)。

函数的参数传递

形式参数:函数定义时的参数简称形参

实际参数:函数调用时的参数简称实参

实参与形参数目、类型和顺序应一致,占据不同存储单元

 

单向值传递

每个函数都有自己的变量空间,参数也位于这个空间

形参调用前不占内存单元调用时对形参分配存储单元并传递实参的值

调用结束后形参单元被释放实参单元仍保持原值

形参值的变化不会改变主调函数中实参的值

板块六:数组

数组是一组有序的类型相同的数据的集合这些数据被称为数组的元素

一维数组的定义与初始化

1.一维数组的定义:

类型说明符 数组名【正整型常量表达式】

eg:float mark【100】;char str【200】;int a【10】;

mark、str、a为数组名

方括号内为数组的长度

下标的个数为数组的维数上面都为一维数组

数组的成员称为数组元素

数组元素的类型称为该数组的基类型

2.一维数组的初始化 

在数组定义时为数组元素赋初值称为数组初始化

(1)对全部元素初始化

int a【5】={2,4,6,8,10};

246810

                      a【0】           a【1】               a【2】          a【3】           a【4】

(2)给部分元素赋值其余按0处理

int a【9】={1,2} 除 a【0】=1,a【1】=2之外其余都为0

(3)全部赋值可不指定长度

(4)一维数组的赋初值的个数不能超过数组中总元素的个数

一维数组的引用

c语言规定只能引用单个数组元素,不能一次引用整个数组

引用形式:数组名 【下标】

下标可以是整型常量、整型变量或整型表达式

下表的值是数组元素的序号从0开始直到n-1

 

 

二维数组的定义和初始化 

 1.类型说明符 数组名【常量表达式1】【常量表达式2】

第一个下标代表行数第二个下标代表列数

存储形式:先存放第一行的元素再存放第二行的元素

eg:float a【3】【4】

a【0】【0】a【0】【1】a【0】【2】a【0】【3】a【1】【0】a【1】【1】……

用于定义数组长度的常量表达式的值必须是大于0的正整数

定义数组元素的个数必须使用常量表达式而不能使用变量

2.二维数组的初始化

(1)分行给二维数组赋初值

int a【2】【3】={{2,3,1},{1,2,3}}

(2)将所有数据写在一个{}内按顺序赋初值。即按数组元素在内存中的排序的顺序赋初值

如int a【2】【3】={2,3,1,1,2,3};

(3)对部分元素赋值

int a【3】【3】={{1},{0,1},{0,1,1}}

(4)对数组所有元素赋值 第一个下标可省略第二个下标不可省略

二维数组的引用

下标法

表示形式:数组名【下标1】【下标2】

eg:int a【2*5】【3*4】,i=15

使用a【3*3】【0】,a【1】【i-5】都是合法的

数组名a表示数组a在内存中的首地址

可以用数组名a来表示数组元素a【0】【0】的地址

数组名是常量不可对他赋值

 

字符数组与字符串 

用来存放字符数据的数组

格式:char 数组名【常量表达式】

字符串实际占有单元的数量等于字符串长度+1.

定义时应注意考虑元素总个数应比实际长度+1

2.字符数组的初始化

(1)用单个字符对字符数组初始化

初值的个数不能超过数组元素的个数

初值的个数小于数组长度系统自动填入结束符’\0'

初值的个数与数组元素相等定义时可以省略长度

因字符串常量自动加入\0,因此常人为地在字符数组后加一个结束符

(2)用字符串常量对字符数组初始化

说明:将字符串存储到字符数组中,字符串和第一个结束符构成有效字符串,对字符串的操作就是对字符数组的操作。

普通数组中的元素是确定的一般用下标控制循环,字符串用结束符控制循环

 

 

板块七 结构体联合体

定义

结构是逻辑上相互联系的一组分量的集合

结构中的分量可以是不同类型的数据称为结构体的成员(区别于数组的地方)

在使用结构体之前首先根据具体问题利用已有数据类型对结构的组成进行描述,称为结构的定义

一般形式为

struct 结构类型名

{

成员列表;};

结构变量的定义

在定义结构体类型之后,表示声明了一种新的数据类型,并没有内存空间的分配,必须用结构体类定义相应的变量才可使用

struct student

{

int num;

char name[20];

char sex;

int age;

char addr[30];};

方法一:先声明结构体类型再定义变量

一般形式;struct 结构类型名

{

成员列表;};

struct 结构类型名 变量名表列;

方法二:在声明结构类型的同时定义变量

一般形式:

struct 结构类型名

{
成员表列;}变量名表列;

方法三:省去结构标签直接定义变量

一般形式:

struct {
成员表列;}变量名表列;

结构变量初始化和引用

结构变量的初始化

结构类型 结构变量名={初始值表};

 

 

 

 

 

结构体变量的使用规则 

(1)对于整个结构可以做赋值,取地址,也可以传递给函数参数

struct point{

int x,y;

}p1,p2;

p1=(struct point){5,10};相当于p1.x=5;p1.y=10;

p2=pq;相当于p2.x=p1.x;p2.y=p1.y;

区别于数组

(2)不能讲一个结构变量作为一个整体进行输入和输出,只能对其各个成员分别进行操作

(3)若成员本身又属于一个结构体类型只能对最低级的成员进行存取以及运算

(4)对成员变量可以像普通变量一样进行各种运算

(5)可以引用成员的地址,也可以引用结构体变量的地址

(6)与数组不同结构体变量的名字不是其地址,如果想获得其地址则需要使用&运算符

结构数组

1.定义

一般形式

struct 结构体类型名

{成员列表;};

struct 结构类型名 结构数组名【尺寸】;

2.初始化及引用

一般形式:

定义数组后加上=【初值表列】

也可以再声明结构体类型的同时定义数组并完成初始化

struct student

{
int num;
char nam[20];
char sex;
int age;
          }stu[2]={{1101,"wangli",'M',19},{1102,"Liping",'F',20}}

访问结构数组中的具体元素,必须遵守数组使用的规定——按下标进行访问

要访问结构数组中某个具体元素的成员,又要遵守有关访问结构成员的规定——使用"."和成员名

结构指针

1.指向结构变量的指针

一般形式:

struct 结构类型名 *结构指针变量名

结构变量的名字并不是结构变量的地址,必须用&运算符

引用结构体变量x的成员有3种方法

(*p).成员名 

x.成员名

p->成员名

2.指向结构数组的指针

struct student{
int num;
char name[15];
flaot score[3];
}x,*p;
p=&x;

引用结构变量x的成员有三种方法:

p-->score[0]引用的是stu[0].score[0]的值

p+1指向下一个结构数据元素stu[1],p+2指向的是stu[2]的首地址

结构类型数据在函数间的传递

结构变量作为函数参数

整个结构作为函数的参数 

将结构作为整体,在函数传递整个结构;

在函数内新建一个结构变量并接受调用者的值

void getpoint(struct point p)

结构成员作为函数的参数

在函数之间传递成员的值

与传递简单变量的方法相同

函数可以返回一个结构

 

结构指针变量作为函数参数

向函数传递的是结构的首地址

形参可以是结构数组,传递的是结构指针的值

传入传出的只是一个指针的大小并不是整个结构

函数返回一个结构指针

结构数组作为函数参数

向函数传递的是结构数组的首地址

形参可以是结构数组也可以是结构指针

仅复制结构的首地址这种按地址传递方式效率更高

联合体 

定义:一般形式为union 共用体类型名 {共用体成员表};

与结构体的异同

相似点:共用体的类型声明、变量定义及引用方式与结构相似

不同点:结构变量所占内存长度根据编译系统环境有所不同采用字节对齐的方法。

共用体变量所占内存长度等于最长的成员的长度

 定义:

方法一:先声明共用体类型再定义变量

一般形式:

union 共用体名

{

成员列表;};

union 共用体名 变量名表列;

方法二:在声明类型的同时定义变量

一般形式:

union 共用体名{

成员表列;}

变量名表列;

方法三:直接定义共用体类型变量

一般形式:

union {

成员表列;}变量名表列;

共用体变量的存储

所有的成员共享一个空间

同一时间只有一个成员是有效的

初始化和引用

初始化:只能初始化第一个成员

union data
{
int i;
char ch;
float f;
};
union data a={12};
union data a={12,'a',3.14};

如程序段所示union data a={12}的表达方式是对的

引用: 

1.共用体变量名.成员名

2.(*指针变量名).成员名

3.指针变量名->成员名

eg:

对于前面所定义的共用体变量a,用以下赋值语句:

a.i=1;a.ch='b';a.f=1.5;

同一时间只有一个成员是有效的,此时只有最后一个赋值是有效的

板块八:指针

内存和地址

内存:就是内部存储器,是由存储单元构成,线性连续。存储单元最小单位是字节。

内存地址:按字节编号,其字长一般与主机相同。32位机使用32位地址,最多支持2^32字节内存。

变量地址:系统分配给变量的内存单元的起始地址

变量存取的方法:直接寻址和间接寻址

通过变量名访问变量——直接寻址

通过指针对变量的访问——间接寻址

定义方法:

类型标识符 *标识符

作用:定义变量为指针型,使之专门用于存放所定义类型变量的地址

注意:一个指针变量只能指向同一类型的变量

无论指针变量指向何种类型,指针变量本身都是整型的,指针变量本身也有自己的地址,占四个字节的存储空间。

指针运算

1.取地址运算:

一般形式:&变量

2.取内容运算符:

一般形式 :*指针表达式

(1)若*p出现在赋值号左边,表示给p所指变量赋值

(2)若*p不出现在赋值号左边,表示p所指变量的值

为指针变量赋初值

指针变量使用前必须有值

指针变量的初值必须是地址值(不能是整数)

(1)在定义指针变量的同时同时初始化

(2)使用赋值语句赋值

可以为指针赋空值(NULL),此时指针不指向任何变量

p=NULL;

指针变量与数组

指针与一维数组:

数组中每个元素都可以通过下标唯一确定 ,即通过下标可以访问(操作)数组中的元素

在c语言中凡是可以通过数组下标方式完成的访问均可以通过指针方式实现

c语言规定:数组名就是数组的首地址常量

访问数组的两种方式

下标方式

int a[10],*p;

p=a;使p指向数组的第一个元素a[0]

指针方式

通过指向数组元素的指针变量访问所需元素。

int a[10],*p=&a[0];

p++;

指针的运算

指数的算术表达

指针表达式与整数的加减运算

指针自增自减运算

指针的关系运算

同类指针相减

强制类型转换运算

指针表达式与整数的加减运算

一般形式

p+n或p-n

其中p是任意一个指针表达式,n是任何一种整型表达式

计算规则

表达式p+n的值=p的值+p所指类型长度*n

表达式p-n的值=p的值-p所指类型长度*n

说明:只有当p和p+q或p-n都指向连续存放的同类型数据区域(数组)时,指针加、减才有实际意义

c语言规定:表达式p+n和p-n的类型与p相同

注意:数组和指针的本质不同:

数组名是指针常量,不能改变指针常量的值

指针p是变量,若p指向数组的首地址,p+1代表该类型的下一变量的地址

指针自增自减运算

语法:后缀 p++ p--

前缀:++p,--p

(1)进行++p或p++运算后都使p指向下一个数据

表达式p++的值等于p的原来的值

表达式++p的值等于p的新值

(2)去内容运算符“*”、取地址运算符“&”和自增自减运算符都是单目运算符,运算的优先级相同,结合方向都是自右至左。

指针的关系运算

int a[10],*p;p=&a[4];

当两个指针指向同一个数组中的元素时才能进行>、<、>=……

“p==NULL”或者“p!=NULL”判断指针p是否指向空

指针的关系运算只有同类指针进行比较才有意义

字符指针与字符串

用字符数组表示

int main()
{
char string[]="I love China!";
printf("%s\n",string);
return 0;}

 用字符指针表示:把“I love china”的首地址赋给指针变量string

特点:字符串长度不受限制,字符指针指向别处,字符串将消失,此字符串不能改变只能读取

int main()
{char *string="I love China!";
printf("%s\n",string);
return 0;}

字符指针变量和字符数组的区别

字符数组由若干个元素组成每个元素中放一个字符,而字符指针变量中存放的是字符串的首地址

赋值方法:char str[]=“”;

                 char str[20];

                 gets(str);

字符指针变量指向字符串首地址。赋值方法有三种:

(1)char *pa=""

(2)char *pa;pa="";

改变字符串的内容:

char str[20],*pa=str;

gets(str)或scanf("%s",pa)或scanf("%s",str);

 指针与函数

指针变量做函数参数

指针变量在做实参时,必须要有确定的值,即指向一个已定义的单元 

返回指针的函数

定义形式:

类型说明符 *函数名([形式参数表])

{

[说明部分]

语句

}

说明:表示函数的返回值是一个指针,其他和一般函数相同

指针数组

数组中所有元素均为指针类型。适合用于指向字符串。

定义形式 :

数据类型 *数组名[常量表达式]

初始化:

必须使用地址值为指针数值初始化

指针数组pa[3]相当于三个指针*pa[0],*pa[1],*pa[2]

使用:

用指针数组和用数组地址引用数组元素是等价的

指针与字符串数组

字符串数组

数组中的每个元素都是存放字符的数组 

字符串数组的每一行可存放一个字符串

用赋初值的方式给字符串数组赋值

(1)直接给字符串数组赋初值

(2)用指针数组处理多个字符串

板块九:宏定义

一般格式:#define 宏名 字符串

功能:在预处理时将程序中宏定义之后出现的所有的宏名用宏替换字符串代替,这个过程也叫宏展开,即将宏名替换成字符串的过程

eg:#define PI 3.1415926

注意:一个宏名只能被定义一次

作用域:从定义开始到程序结束

在进行宏定义时可以引用已定义的其他宏名

对在字符串常量及用户标识符中与宏名相同的部分不做替换

带参数的宏定义:

一般形式:#define 宏名(形参表) 字符串

调用格式:宏名(实参数)

终止宏定义:

在程序想终止宏定义的作用,可以使用终止宏定义命令

终止宏定义格式:#undef 宏名

参考资料:

慕课《c语言程序设计》

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值