C语言

C语句可以分为五类:
(1)表达式语句
表达式语句由表达式加上分号“;”组成。
一般形式为:表达式;
执行表达式语句就是计算表达式的值。
(2)函数调用语句
函数调用语句:由函数名、实际参数加上分号“;”组成。
一般形式为:函数名(实际参数表)
执行函数语句就是调用函数体并把实际参数赋予函数定义中的形式参数,然后执行被调函数体重的语句,求取函数值。
(3)控制语句
控制语句用于控制程序的流程,以实现程序的各种结构方式。由特定的语句定义符组成。C语言有九中控制语句。可分成以下三类:
1)条件判断语句:if语句、switch语句;
2)循环执行语句:do while语句、while语句、for语句
3)转向语句:break语句、goto语句、continue语句、return语句。
(4)复合语句
把多个语句用括号{}括起来组成的一个语句称符合语句。
在程序中应把复合语句看成是单条语句,而不是多条语句。
复合语句内的各条语句都必须以分号“;”结尾,在括号“}”外不能加分号。
(5)空语句
只有分号“;”组成的语句称为空语句。空语句是什么也不执行的语句。在程序中空语句可以用来作空循环体。

putchar函数(字符输出函数)

putchar函数是字符输出函数,其功能是在显示器上输出单个字符。一般形式为:putchar(字符变量)
对控制字符则执行控制功能,不在屏幕上显示。
eg:
putchar(‘A’); 输出大写字母A
putchar(x); 输出字符变量x的值
putchar(’\n101’);也是输出字符A
putchar(’\n’);换行

getchar函数(键盘输入函数)
getchar函数的功能是从键盘上输入一个字符
getchar();
通常把输入的字符赋予一个字符变量,构成赋值语句。
eg:char c;
c = getchar();

格式字符意义
d以十进制形式输出带符号整数
o以八进制形式输出无符号整数
x,X以十六进制形式输出无符号整数
u以十进制形式输出无符号整数
f以小数形式输出单,双精度实数
e,E以指数形式输出单,双精度实数
g,G以%或%e中较短的输出宽度输出单,双精度实数
c输出的那个字符
s输出字符串

关系运算符:在程序中经常需要比较两个量的大小关系,以决定程序下一步的工作。比较两个量的运算符称为关系运算符。
关系运算符的优先级低于算术运算符,高于赋值运算符。

当if语句中的执行语句又是if语句时,则构成了if语句嵌套的情形。else总是与它前面最近的if配对。尽量少使用if语句的嵌套。

条件运算符为“?”和“:”,它是一个三目运算符,即有三个参与运算的量。由条件运算符组合成能条件表达式的一般形式为:
表达式1 ? 表达式2 : 表达式3
求值规则是:如果表达式1的值为真,则以表达式2的值作为条件表达式的值,否则以表达式3的值作为整个条件表达式的值。
条件运算符的运算优先级低于关系运算符和算术运算符,但高于赋值运算符。条件运算符的结合方向是自右向左。

switch语句
switch(表达式){
case常量表达式1 : 语句1;
break;
case常量表达式2 : 语句2;
break;
.
.
default : 语句n;
}
其语意是:计算表达式的值。并逐个与其后的常量表达式的值比较,当表达式的值与某个常量表达式的值相等时,就执行其后的语句,然后不再进行判断,继续执行后面所以case后的语句。若都不相同就执行default语句。break跳出switch。不然就会把case都执行一遍。

循环控制程序
1)用goto语句和if语句构成循环
goto 语句标记
2)用while语句
3)用do-while语句
4)用for语句

while语句的一般形式为:while(表达式)语句
其中表达式是循环条件,语句为循环体。
while语句的语义是:计算表达式的值,当值为真时,执行循环体语句。为假则一次也不执行。

do-while语句一般形式是:
do
语句
while(表达式);
与while循环的不同在于:它先执行循环中的语句,然后再判断表达式是都为真,如果为真则继续执行循环;如果为假,则终止循环,因此do-while循环至少要执行一次循环语句。

for(表达式1;表达式2;表达式3)语句
for(循环变量赋初值;循环条件;循环变量增量)语句
(循环变量赋初值总是一个赋值语句,它用来给循环控制变量赋初值;循环条件是一个关系表达式,它决定什么时候退出循环;循环变量增量,定义循环控制变量每循环一次后按什么方式变化)
执行过程如下:
1)先求解表达式1.
2)求解表达式2,若其值为真,则执行for语句中指定的内嵌语句,然后执行下面第3)步,如其值为假,则结束循环,转到第5)步。
3)求解表达式3;
4)转回上面第2)步继续执行;
5)循环结束,执行for语句下面的一个语句。
for(i=1;i<=100;i++)
{
sum = sum + i;
}
先给i赋初值1判断i是否小于等于100,若是则执行语句,之后值增加1.再重新判断,直到条件为假,即i>100时,结束循环。
表达式1,2,3都可以缺省但是;不能缺省,缺省条件1,则没有初值,省略条件2,则不做其他条件时,则变为死循环。省略了表达式3,则不对循环控制变量进行操作,这时可以语句体中加入修改循环控制变量的语句。省略了三个表达式相当于while(1)语句。表达式1可以是设置循环变量的初值的幅值表达式,也可以是其他表达式。表达式1和表达式3可以是一个简单表达式也可以是逗号表达式。表达式2一般是关系表达式或逻辑表达式,但也可以是数值表达式或字符表达式,只要其值非0.就执行循环体。

while循环、do-while循环和for循环,可以用break语句跳出循环,用continue语句结束本次循环。

break语句可以用来从循环体内跳出循环,即提前结束循环,接着执行循环下面的语句。一般形式:break;
break语句不能用于循环语句和switch语句置位的任何其他语句中。
注意:1)break语句对if-else的条件语句不起作用。
2)在多层循环中,一个break语句只向外跳一层。
continue语句作为结束本次循环,即跳过循环体汇总下面尚未执行的语句,接着进行下一次是都执行循环的判定。
一般形式:continue;

数组
在程序设计中,为了处理方便,把具有相同类型的若干变量按有序的形式组织起来。这些按序排列的同类数据元素的集合称为数组。在C语言中,数组属于构造数据类型。一个数组可以分解为多个数组元素,这些数组元素可以是基本数据类型或是构造类型。因此按数组元素的类型不同,数组又可分为数值数组、字符数组、指针数组、结构数组等各种类别。
数组:具有相同类型的数据组成的序列,是有序集合。
数组中的每个数据称数组元素。由其所在的位置序号(称数组元素的下标)来区分。
用数组名与下标可以用统一的方式来处理数组中的所有元素,从而方便的实现处理一批具有相同性质数据的问题。

一维数组的定义方式为:
类型说明符 数组名 [常量表达式]
eg: int a [10];
表示定义了一个整形数组,数组名为a,此数组有10个元素,10个元素都是整形变量。
允许在同一个类型说明中,说明多个数组和多个变量。数组元素下标从0开始计数。
c语言不允许对数组的大小作动态定义,即数组的大小不依赖程序运行过程中变量的值。不能用变量说明数组大小。
二维数组和一维数组类似,定义方式为:
类型说明符 数组名 [常量表达式] [常量表达式]

函数
一个较大的程序可分为若干个程序模块,每个模块用来实现一个特定的功能。
在高级语言中用子程序实现模块的功能,子程序由函数来完成。
一个c程序可以由一个主函数和若干个其他函数构成。
由主函数调用其他函数,其他函数也可以相互调用。同一个函数可以被一个或多个函数调用任意多次。
(1)一个c程序由一个或多个程序模块组成,每一个程序模块作为一个源程序模块。对较大的程序,一般不希望把所有内容全放在一个文件中,而是将他们分别放在若干个源文件中,再由若干源程序文件组成一个c程序。这样编译分别编写、分别编译、提高调试效率。一个源程序文件可以分贝为多个c程序共用。
(2)一个源程序文件由一个或多个函数以及其他有关内容组成。一个源程序文件是一个编译单位,在程序编译时,是以源文件程序文件为单位进行编译的,而不是以函数为单位进行编译的。
(3)c程序的执行是从main函数开始的,如是在main函数中调用其他函数,在调用后流程返回到main函数,在main函数中结束整个程序的运行。
(4)所有函数都是平行的,即在定义函数时,是分别进行的,是相互独立的。一个函数并不从属于另一函数,即函数不能嵌套定义。函数间可以相互调用,但不能调用main函数,main函数是系统调用的。
(5)标准函数即库函数和用户自己定义函数,无参数函数和有参函数。
定义无参函数的一般形式为:
类型表示符 函数名()
{
声明部分
语句部分
}
在函数定义时要用“类型标识符”指定函数值的类型,即函数带回的值的类型。void表示不需要带回函数值。

定义有参函数的一般形式为:
类型标识符 函数名 (形式参数列表)
{
声明部分
语句部分
}

return后面的括弧中的值()作为函数带回的值(称函数返回值)
在不同的函数之间传递数据,可以使用的法:
参数:通过形式参数和实际参数
返回值:用return语句返回计算结果
全局变量:外部变量

在定义函数中指定的形参,在未出现函数调用时,它们并不占用内存中的存储单元。只有在发生函数调用时,函数max中的形参才被分配内存单元。在调用结束后,形参所占的内存单元也被释放。
(2)实参可以是常量,变量或表达式,但要求它们有确定的值,在调用时,将实参的值赋给形参。
(3)在被定义的函数中,必须指定形参的类型。
(4)实参与形参的类型应相同或赋值兼容。
(5)实参向对形参的数据传递是值传递,单向传递,只由实参传给形参,不能由形参传回来给实参。在内存中,实参单元与形参单元是不同的单元。

希望通过函数调用使主调函数能得到一个确定的值,这就是函数的返回值。
函数的返回值是通过函数中的return语句获得的:
(1)return语句将被调用函数中的一个确定值带回到主调函数中去;
(2)如果需要从被调函数带回一个函数值供主调函数使用,被调函数中必须包含一个return语句。如果不需要从被调函数带回函数值可以不用return语句。
一个函数中可以有一个以上的return语句,执行到哪个return语句,哪个语句起作用。return语句后面的值可以是一个表达式(表达式算出一个确定的值)
(4)函数的返回值应该属于某一个确定的类型,在定义函数时指定函数返回值的类型。
(5)在定义函数时指定的函数类型一般应该和return语句中的表达式类型一致。如果函数值的类型和return语句中表达式的值不一致,则以函数类型为准。
(6)对不带返回值的函数,用“void”定义函数为“无类型”或称“空类型”。

函数调用的一般形式
(1)函数调用的一般形式为:函数名(实参列表)
如果是调用无参函数,则“实参列表”可以没有,但括号不能省略。
如果实参列表包含多个实参,则各参数间用逗号隔开。实参与形参的个数相等,类型匹配。实参与形参按顺序对应,一一传递数据。

1.函数语句
把函数调用作为一个语句。这时不要求函数带返回值,只要求函数完成一定的操作。
2.函数表达式
函数出现在一个表达式中,这种表达式称为函数表达式,这时要求函数带回一个确定的值以参加表达式的运算。
3.函数参数
函数调用作为一个函数的实参。m=max(a,max(b,c)),
函数调用作为函数的参数,实质上也是函数表达式形式调用的一种,因为函数的参数本来就是要求是表达式形式。

如果使用用户自己定义的函数,而该函数的位置在调用它的函数(即主调函数)的后面(在同一个文件中),应该在主调函数中对被调用的函数作声明。如果被调用函数的定义出现在主调函数之前,可以不必加以声明。因为编译系统已经先知道了已定义函数的有关情况,会根据函数首部提供的信息对函数的调用作正确性检查。

声明的作用是把函数名、函数参数的个数和参数类型等信息通知编译系统,以便在遇到函数调用时,编译系统能正确是被函数并检查调用时否合法。

函数的嵌套调用:
c语言不能嵌套定义函数,但可以嵌套调用函数,也就是说,在调用一个函数的过程中,又调用另一个函数。

递归:
在调用一个函数的过程中又出现直接或间接的调用该函数本身,称为函数的递归调用。

数组作为函数的参数
数组可以作为函数的参数使用,进行数据传送。数组用作函数参数的两种形式:
一种是:把数组元素(下标变量)作为实参使用;
数组元素就是下标变量,它与普通变量并无区别。因此它作为函数实参使用与普通变量是完全相同的,在发生函数调用时,把作为实参的数组元素的值传递给形参,实现单向的值传送。

另一种是:把数组名作为函数的形参和实参使用
数组名其实就是一堆数组变量的第一个元素的地址。
用数组名作函数参数时,则要求形参和相对应的实参都必须是类型相同的数组,都必须有明确的数组说明。的那个形参和实参二者不一致时,就会发生错误。
在用数组名作函数参数时,不是进行值的传送(进行址传送),即不是把实参数组的每一个元素的值都赋予形参数组的各个元素,因为实际上形参数组并不存在,编译系统不为形参数组分配内存。

数组名就是数组的首地址。在数组名作函数参数时所进行的传送只是地址的传送,也就是把实参数组的首地址赋予形参数组名。形参数组名取得该首地址之后,也就等于有了实在的数组。实际上是形参数组和实参数组为同一数组,共同拥有一段内存空间。

局部变量:在一个函数内部定义的变量是内部变量,它只在本函数范围内有效,也就是说只有在本函数内才能使用它们,在此函数以外是不能使用这些变量的。形式参数也是局部变量。
全局变量之外定义的变量称为外部变量,外部变量是全局变量。全局变量可以为本文件中其他函数所共用,它的有效范围从定义变量的位置开始到本源文件的结束。

建议不在必要时不要使用全局变量,原因如下:(1)全局变量在程序的全部执行过程中都占用存储单元,而不是仅在需要时才开辟单元。(2)使用全局变量过多会降低程序清晰度。(3)可移植性差

静态存储方式是指在程序运行期间由系统分配固定的存储空间的方式。
动态存储方式则是在程序运行期间根据需要进行动态的分配存储空间的方式。

C语言中每个变量和函数有两个属性:数据类型和数据的存储类别。
对数据型,存储类别指的是数据在内存中存储的方式。
存储方式分为两大类:静态存储类和动态存储类。

函数中的局部变量,如不专门声明为static存储类别,都是动态地分配存储空间的(栈),数据存储在动态存储区汇总。
自动变量用关键字auto作存储类别的声明。

有时候希望函数中的局部变量的值在函数调用结束后不消失而保留原值,即其占用的存储单元不释放,在下次该函数调用时,该变量已有值,及时上次函数调用结束时的值,这就应该指定该局部变量“静态局部变量”用关键字static进行声明。

静态局部变量属于静态存储类别,在静态存储区内分配存储单元。在程序整个运行期间都不释放。
对静态局部变量是在编译时赋初值的,只赋值一次,在程序运行时它已有初值。

为提高执行效率,C语言允许将局部变量的值放在CPU中的寄存器中,需要用时,直接从寄存器取出参加运算,不必到内存中存取。这种变量叫做寄存器变量,用关键字register作声明。

外部变量即全局变量,它的作用域是从变量的定义处开始到程序文件的末尾。在此作用域内,全局变量可以为程序中各个数所引用,编译时将外部变量分配在静态存储区。可以用extern来声明外部变量,以扩展外部变量的作用域。

将一个文件拆成多个文件。将全局变量要通过extern传递到另一个新的文件。

如果在程序设计中希望某些外部变量只限于被本文件引用,而不能被其他文件引用。这时可以在定义外部变量时加上static声明。

一般为了叙述方便,把建立存储空间的声明称定义,而把不需要建立存储空间的声明称为声明。

如果一个函数只能被本文件中其他函数所调用,它称为外部函数。在定义内部函数时,在函数名和函数类型的前面加static,即
static 类型标识符 函数名(形参表)

在定义函数时,如果在函数首部最左端加关键字extern,则表示此函数是外部函数,可供其他文件调用。如果不写则默认为外部函数。

指针

内存区的每一个字节有一个编号,这就是“地址”。如果在程序中定义了一个变量,在对程序进行编译时,系统就会给这个变量分配内存单元。
对变量的访问有两种方式,直接访问和间接访问。

指针是一种特殊的变量,它是存放地址的。假设我们定义了一个指针变量 int *i_pointer用来存放整型变量i的地址。可以通过下面语句:
i_pointer = &i;
*:取值操作符
&:取址操作符
eg:
int i =2000;
int *pointer; //定义一个指针,指针变量
pointer = &i; //把i的地址赋给pointer
pfintf("%d\n",*pointer); //取出地址所存放的值i

知道了一个变量的地址,就可以通过这个地址来访问这个变量,因此又把变量的地址称为该变量的指针。

指针变量,专门用来存放变量的地址。指针变量的值(即指针变量中存放的值)是地址(即指针)。
可以用赋值语句使一个指针变量得到另一个变量的地址,从而使它指向一个该变量。

指针变量前面的“*“,表示该变量的类型为指针型变量。其一般形式为
类型说明符 *变量名;
*表示这是一个指针变量,变量名即为定义的指针变量名,类型说明符表示本指针变量所指向的变量的数据类型。

定义指针变量时必须指定基类型。只有整型变量的地址才能放到指向整型变量的指针变量中。

地址运算符&表示变量的地址。
其一般形式为: &变量名;

*&a和
*pointer_1的作用是一样的,它们都等价于变量a。即 *&a与a等价。
&*pointer_1和&a的作用一样

数组与指针

一个变量有地址,一个数组包含若干元素,每个元素都在内存中占用存储单元,它们都有相应的地址。
指针变量既然可以指向变量,当然也可以指向数组元素(把某一元素的地址放到一个指针变量中)
数组元素的指针就是数组元素的地址。

数组元素的引用:
下标法:如a[i]形式
指针法:如*(a+i)或*(p+i)
其中a是数组名,p是指向数组元素的指针变量,其初值p=a=&a[0];
数组名是数组的第一个元素的地址。

C语言调用函数时虚实结合的方法都是采用值传递的方式,当用变量名作为函数参数传递的是变量的值,当用数组名作为函数参数时,由于数组名代表的是数组首元素地址,因此传递的值是地址,所以要求形参为指针变量。

多维数组与指针

用指针变量可以指向一维数组中的元素,也可以指向多维数组中的元素。
在这里插入图片描述
指向多维数组元素的指针变量
把二维数组a分解为一维数组a[0],a[1],a[2]之后,设p为指向二维数组的指针变量,可定义为:
int (*p)[4];
表示p是一个指针变量,它指向包含4个元素的一维数组。若指向第一个一维数组a[0],其值等于a,a[0],或&a[0][0].
p+i则指向一维数组a[i].
*(p+i)+j是二维数组i行j列的元素的地址
*( *(p+i)+j)则是表示i行j列元素的值。

二维数组指针变量说明的一般形式为:
类型说明符 (*指针变量名)[长度];
类型说明符为所指数组的数据类型。“ *”表示其后的变量是一个指针类型。
长度表示二维数组分解为多个一维数组时,一维数组的长度,也就是二维数组的列数。

字符与指针

对字符串中字符的存取,可以用下标的方法,也可以用指针方法
字符数组和字符指针变量都能实现字符串的存储和运算,但他们之间还是有区别:
1、字符数组由若干个元素组成,每个元素中放一个字符,而字符指针变量中存放的是地址(字符串第一个字符的地址),不是将字符串放到字符指针变量中。
2、对字符数组只能对各个元素赋值。
char *a =" i love xx";
等价于
char *a;
a = “i love xx”;
3、如果定义了一个字符数组,在编译时为它分配内存单元,它有确定的地址。而定义一个字符指针变量,给指针变量分配内存单元,在其中可以放一个字符变量的地址,也就是说,给指针变量可以指向一个字符型数据,但如果未对它赋予一个地址值,则它并未具体指向一个确定的字符数据。
4、指针变量的值是可以改变的
若定义了一个指针变量,并使它指向一个字符串,就可以用下标形式引用指针变量所指的字符串中的字符

用函数指针变量调用函数
一个函数在编译时被分配一个入口地址,这个函数的入口地址就称为函数的指针。

函数指针变量的常用用途之一就是把指针作为参数传递到其他函数。实现函数地址的传递,这样就能在被调用的函数中使用实参函数。

返回指针值的函数
一个函数可以带回一个整型值、字符值、实型值等,也可以带回指针型的数据即地址。带回指针值的函数一般定义形式:
类型名 *函数名 (参数列表)
eg
int *a(int x, int y);

指针函数是指带指针的函数,本质是一个函数。
函数指针是指向函数的指针变量,因而函数指针本身首先是指针变量,只不过该指针变量指向函数。

指针数组:一个数组,若其元素均为指针类型数据,称为指针数据,也就是说,指针数组中的每个元素都相当于一个指针变量。一维指针数组的定义形式为
类型名 数组名【数组长度】;
int *name[4];

在这里插入图片描述
p = max; (max为已定义的函数,将max的入口地址赋给p),指向函数的指针。
如果两个指针变量都指向同一个数组中的元素,则两个指针变量值之差是两个指针之间的元素个数。

void指针可以指向任何类型数据。可以用任何类型的指针直接给void指针赋值。但是如果需要将void之指针的值赋给其他类型的指针,则需要进行强制转换。
const使一个变量常量化,不能被改变。

预处理

在源程序中这些命令都是放在函数之外,而且一般都放在源文件的前面,称为预处理部分。
无参宏的宏名后不带参数。
其定义的一般形式为:
#define 标识符 字符串
凡是以#开头的都是预处理命令。
define为宏定义命令。“标识符”为所定义的宏名,“字符串”可以是常数、表达式、格式串等。
eg: #define PI 3,.14159
(1)宏定义是用宏名来表示一个字符串,在宏展开时有以该字符串取代宏名,这是一种简单的代换,字符串中可以含任何字符。可以是常数也可以是表达式,预处理程序对它不作任何检查。如有错误,只能在编译已被宏展开后的源程序时发现。
(2)宏定义不是说明或语句,在行末不必加分号,如加上分号则连分号也一起置换。
(3)宏定义必须写在函数之外,其作用域为宏定义命令起到源程序结束。如要终止其作用域可使用#undef命令。 #undef 宏名
(4)宏名在源程序中若用引号括起来,则预处理程序不对其起作宏代换。
(5)宏定义允许嵌套,在宏定义的字符串中可以使用已经定义的宏名。在宏展开时由预处理程序层层代换。
(6)习惯上宏名用大写字母表示,以便于与变量区别。
(7)可用宏定义表示数据类型
#define INTEGER int

宏定义只是简单的字符串代换,是在预处理完成的,而typedef是在编译时预处理的,它不是作简单的代换,而是对类型说明符重新命名。被命名的标识符具有类型定义说明的功能。
eg:
typedef char* PIN2;
void main()
{
PIN2 a,b; ===char *a, *b;
}

C语言允许宏带有参数。在宏定义中的参数称为形式参数,在宏调用中的参数称为实际参数。对带参数的宏,在调用中,不仅要宏展开,而且要用实参去代换形参。
带参宏定义的一般形式为:
#define 宏名(形参表) 字符串
带参宏调用的一般形式为:宏名(实参表);
(1)带参宏定义中,宏名和形参表之间不能有空格出现
(2)在带参宏定义中,形式参数不分配内存单元,因此不必作类型定义。而宏调用中的实参有具体的值,要用它们去代换形参,因此必须作类型说明。
(3)在宏定义中的形参是标识符,而宏调用中的实参可以是表达式。

1、一个include命令只能指定一个被包含文件,若有多个文件要被包含,则需要多个include命令。
2、文件包含允许嵌套,即在一个被包含的文件中又可以包含另一个文件。

条件编译:
1、#ifdef 表示符
程序段1
#else
程序段2
#endif
功能是:如果标识符已被#define命令定义过在对程序段1进行编译,否则对程序段2进行编译。如果没有程序段2,则#else可以没有不写
2、#ifndef 标识符
程序段1
#else
程序段2
#endif
3、#if 常量表达式
程序段1
#else
程序段2
#endif

结构体

将不同类型的数据组合成一个有机的整体,以便引用。
定义一个结构的一般形式为:
struct 结构名
{
成员列表
};
成员列表由若干个成员组成,每个成员都是该结构的一个组成部分。对每个成员也必须作类型说明,其形式为:
类型说明符 成员明;

定义结构体类型变量:
(1)先声明结构体类型再定义变量名
eg : struct student student1,student2;
类型明 结构体 变量名 变量名
定义了student1和student2为struct student类型的变量,即它们具有struct student类型的结构。
(2)在声明类型的同时定义变量
一般形式为:
struct 结构体名
{
成员列表
}变量名列表;
(3)直接定义结构体类型变量
一般形式为:
struct
{
成员列表
}变量名列表;
即不出现结构体名。


结构体的嵌套
struct data
{
int month;
int day;
int year;
};
struct
{
int num;
char name[20];
char sex;
struct data birthday;
float score;
}boy1, boy2;

引用结构体变量:
(1)不能将一个结构体变量作为一个整体进行输入和输出。
结构体变量名.成员名
对其赋值为:
eg:结构体变量名.成员名 = 100;
“.”是成员运算符,在所有的运算符中优先级最高。
(2)如果成员本身又属于一个结构体类型,则要用若干个成员运算符,一级一级地找到最低的一级成员,只能对最低级的成员进行赋值或存取以及运算。
student1.birthday.month
(3)可以引用结构体变量成员的地址,也可以引用结构体变量的地址。

结构体变量的初始化类似数组

结构体数组:结构体数组与数值型数组不同之处在于每个数组元素都是一个结构体类型的数据,它们都分别包括各个成员。
定义结构体数组:
struct student
{
int num;
char name[20];
char sex;
int age;
float score;
char addr[30];
};
struct student student[3];
或者
struct student
{
int num;
char name[20];
char sex;
int age;
float score;
char addr[30];
} student[3];

结构体数组初始化:
先声明结构体类型,然后定义数组为结构体类型,在定义数组时初始化。
struct student
{
int num;

};
struct student str[]{{…},{…}…};

一个结构体变量的指针就是该结构体变量所占据的内存段的起始地址。
可以设一个指针变量,用来指向一个结构体变量,此时该指针变量的值是结构体变量的起始地址。
指针变量可以用来指向结构体数组中的元素。

结构指针变量的一般形式为:
struct 结构名 *结构指针变量名

赋值就是把结构变量的首地址赋予该指针变量,不能把结构名赋予该指针变量。结构名只能表示一个结构形式,编译系统并不对它分配内存空间。
访问的一般形式为:
(*结构指针变量).成员

结构指针变量->成员名
eg:
struct stu
{
int a;
char b;
}boy1 = {1,c};

void main
{
struct stu *pstu;
pstu = &boy1;
…boy1.a;
…boy1.b;
( * pstu).a;
( *pstu).b;
}

文件的操作

文件分为普通文件和设备文件两种。
操作系统是以文件为单位对数据进行管理的。
文件型指针变量:
FILE *fp;
fp是一个指向FILE类型结构体的指针变量。
1.文件的打开(fopen函数)
函数的调用:
FILE *fp;
fp = fopen (文件名,使用文件方式);
|

文件的使用方式含义
“r”只读,为输入打开一个文本文件
“W”只写,为输出打开一个文本文件
“a”追加,向文本文件尾增加数据
“rb”只读,为输入打开一个二进制文件
“wb”只写,为输出打开一个二进制文件
“ab”追加,向二进制文件尾增加数据
“r+”读写,为读写打开一个文本文件
“W+”读写,为读写建立一个新的文本文件
“a+”为读写打开一个文本文件
rb+-为读写打开一个二进制文件-
wb为读写见了一个新的二进制文件
ab+为读写打开一个二进制文件

用“r”打开一个文件时,该文件必须已经存在,且只能从该文件读出
用“w”打开的文件只能向该文件写入。若打开的文件不存在,则以指定的文件名建立该文件,若打开的文件已经存在,则将该文件删去,重建一个新文件。
若要向一个已存在的文件追加新的信息,只能用“a”方式打开文件,但此时该文件必须是存在的,否则将会出错。

eg:
fp = fopen(“H: / fish.txt”,“rb”);

2.文件的关闭(fclose函数)
函数调用:
fclose(文件指针);
函数功能:
使文件指针变量不指向该文件,也即是文件指针变量与文件“脱钩”,此后不能再通过该指针对原来与其相关联的文件极性读写操作。
返回值:
关闭成功返回值为0;否则返回EOF(-1)

字符读写函数:fgetc和fputc
字符串读写函数:fgets和fputs
数据块读写函数:freed和fwrite
格式化读写函数:fscanf和fprintf

位运算

&按位与
|按位或
^按位异或
~取反
<<左移
‘’>>右移
除了取反,其余的均为二目运算符
运算量只能是整型或字符型的数据,不能为实型数据。
如果参加&运算的是负数,则要以补码的形式表示为二进制,然后再按位进行“与”运算。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值