c语言基本知识_第1页
c语言基本知识_第2页
c语言基本知识_第3页
c语言基本知识_第4页
已阅读5页,还剩47页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

C语言基本知识第1章C语言及程序设计基本知识程序:是以计算机能执行的指令形式出现的、能完成具体工作任务的详细步骤。程序设计:是用户根据具体的工作任务编写出能让计算机高效地完成该任务的程序的过程。1.简单的程序设计一般包含以下几个部分:(1)确定数据结构。分析具体任务,确定输入数据和输出数据,确定数据的逻辑结构和存储结构。(2)确定算法。根据确定的数据结构确定解决问题的方法,即完成任务的一步ー步的步骤。(3)编写程序。根据确定的数据结构和算法,使用选定的计算机语言编写程序代码。简称“编程”。(4)调试程序。将编写好的程序输入到计算机内存中,对程序进行测试并修正,直到程序符合任务要求。(5)整理文档资料。根据数据结构和程序整理编写相关的文档资料。2.为解决某ー特殊问题而采取的确定而有限的操作步骤,称为算法。ー个算法应具备以下五个基本特征:(1)确定性。(2)可行性。(3)有穷性。(4)有零个或多个输入。(5)有一个或多个输出。第2章数据与运算常量与变量常量:是在程序运行过程中其值不能发生改变的量。变量:是在程序运行过程中其值可以发生改变的量。变量在内存中占据一定的存储单元。在该存储单元中存放变量的值。变量的标识通过给变量取名实现,所以ー个变量应该有一个名字。用来标识变量名、符号常量名、函数名、数组名、类型名、文件名的有效字符序列称为标识符,简单地说,标识符就是ー个名字。2数据类型.字符型变量用来存放字符常量。类型说明符为char〇占1个字节(8位)内存空间。字符变量的定义:字符型类型说明符变量标识符,变量标识符,…;示例:chara,b;/・定义a,b为字符型变量・/字符值是以ASCII码的形式存放在变量的内存单元中的。第3章顺序结构程序设计1赋值语句赋值语句是由赋值表达式再加上分号构成的表达式语句。赋值语句的一般形式为:变量=表达式;赋值语句的功能和特点都与赋值表达式相同。2输入输出函数.字符数据输入函数格式:getchar()功能:从键盘上接收输入的一个字符。例3.1从键盘输入ー个字符,并将其存入字符型变量c中。ttincludestdio.hmain(){charc;c=getchar();}其中c是字符型(char)或整型(inい变量。.字符数据输出函数格式:putchar(c)功能:向终端输出ー个字符。说明:(1)c可以是字符型,也可以是整型。(2)c可以是变量,可以是常量,也可以是表达式。main(){charc;c=getchar(); /*从键盘输入ー个字符・/putchar(c); /*在屏幕上显示ー个字符・/3.main(){inta=123;longb=135790;printf("a=%d\n”,a);printf("a=%4d\n”,a);printf("a=%2d\n",a);printf("b=%ld”,b);)屏幕显示结果:a=123a=123a=123b=135790main()inta=-l;charc='a';printf("%d,%o,%x,%u\n,/,a,a,a,a);printf("%d,%c\n”,c,c);)屏幕显示结果:-1,177777,ffff,6553597,a2输入输出函数.格式化输入函数格式:scanf(格式控制,地址表);功能:用来输入任何类型数据,可同时输入多个不同类型的数据。说明:(1)地址表中每项以逗号分隔,列出需要输入的项(变量)的地址,而不是变量名。inta,b;chard,w;scanf("%d%d”,&a,&b);scanf("%3d%d”,&a,&b);scanf("%d%c%c”,&a,&d,&w);输入:123423123456123al结果:a-1234b=23a=123b=456a=123d='a'w=T'求一个同学三门功课的平均成绩main(){inta,b,c;floatv;printf("a,b,c=?”);scanf("%d,%d,%d",&a,&b,&c);v=(a+b+c)/3.0;printf("v=%f\n",v);)将键盘上输入的大写字母转换成小写字母输出。#include<stdio.h>main(){charc;printf("c=?");scanf(z,%c",&c); /*或c二getchar();*/c二c+32;printf("c二%c\n",c); /*或putchar(c);*/第4章选择结构程序设计4.2if语句明:if与else的配对关系从最内层开始,else总是与离它最近的未曾配对的if配对。if与else的个数最好相同,从内层到外层ーー对应,以避免出错。(3)如果if与else的个数不相同,可以用花括号来确定配对关系。5开关语句(if语句)开关语句的功能是:首先计算switch后面圆括号内表达式的值,若此值等于某个case后面的常量表达式的值,则转向该case后面的语句去执行;若表达式的值不等于任何case后面的常量表达式的值,则转向default后面的语句去执行,如果没有default部分,则将不执行switch语句中的任何语句,而直接转到switch语句后面的语句去执行。说明:switch后面圆括号内的表达式的值和case后面的常量表达式的值都必须是整型或字符型,不允许是浮点型。(2)同一个switch语句中的所有case后面的常量表达式的值都必须互不相同。(3)switch语句中的case和default的出现次序是任意的,也就是说default也可以位于case的前面,且case的次序也不要求按常量表达式的大小顺序排列。(4)每个case或default后的语句可以是多条语句,但不需要使用“{“和”}”括起来。(5)由于switch语句中的“case常量表达式”部分只起标号的作用,而不进行条件判断,所以在执行完某个case后的语句后,将自动转到该语句后面的语句去执行,直到遇到switch语句的右花括号或break语句为止,而不再进行条件判断。如果在执行完一个case分支后,要跳出switch语句转到下一条语句执行,可在ー个case结束后、下ー个case开始前插入一个break语句。程序ー且执行到braek语句,将立即跳出switch语句。注意:switch的表达式后不能有“ゴ’。case和default与其后面的常量表达式间至少有一个空格。(3)switch语句可以嵌套,break语句只跳出它所在的switch语句。(4)default语句可以省略。第5章循环结构程序设计5.1循环语句1.goto语句(1)语句标号是ー个用户标识符,在程序中一个语句的前面,表示转向的地址。(2)语句标号仅仅对goto语句有效,对其他语句不影响。同一个程序中,不允许有同名的语句标号。(3)由于滥用goto语句将导致程序流程无规律、可读性差,不符合结构化程序设计原则,因此结构化程序设计方法限制使用goto语句。)goto语句的主要作用是:与条件语句if配合使用,用来实现条件转移、构成循环、跳出循环体等功能。1.4for语句(1)for语句的条件测试在前,所以循环体可能一次也不执行。(2)在for语句中,使循环趋向于结束的语句,即设置修改循环条件的语句,一般是表达式3语句,也可以放在循环体中。(3)如果for语句的循环体部分是多个语句组成的,也必须用左右花括号括起来,使其形成复合语句。(4)for语句中的表达式1和表达式3都可以是一个简单的表达式,也可以是逗号连接的多个表达式,此时的逗号作为运算符使用。5)for语句中的表达式2一般是关系表达式或逻辑表达式,但也可以是数值表达式或字符表达式,如果其值为非。,即为真,就执行循环体。(6)for语句中的三个表达式都可以省略,但用于三个表达式之间的分隔符“;”不能省略。5.3break和continue语句5.3.1break语句功能:该语句可以使程序运行时中途退出ー个循环体。1)break语句不能用于循环语句和开关语句之外的任何其他语句。(2)在多重循环的情况下,使用break语句时,仅仅退出包含break语句的那层循环体,即break语句不能使程序控制退出ー层以上的循环。(3)在几种循环中,主要是在循环次数不能预先确定的情况下使用break语句,在循环体中增加一个分支结构。当某个条件成立时,由break语句退出循环体,从而结束循环过程。3.2continue语句格式:continue;功能:结束本次循环,即跳过循环体中下面尚未执行的语句,继续进行下一次循环。说明:continue语句只结束本次循环,而不是终止整个循环的执行。5.4应用举例循环算法小结:(1)在循环程序设计中,使用较多的算法是穷举法和递推法。穷举法:穷举法的基本思想是,对问题的所有可能状态ーー测试,直到找到问题的解或将全部可能状态都测试过为止。递推法:递推法的基本思想是,不断用新值取代变量的旧值,或由旧值递推出变量的新值。在递推算法中,要重点考虑以下因素:变量的初值。递推公式。递推次数(2)在循环程序设计中,循环控制有两种方法:1)标志法:主要用在循环次数不确定的情况下。其基本思想是,设置ー标志变量,标志变量的值随着循环发生变化,每循环一次,就测试一次标志变量的值,当标志变量的值等于指定标志值时,结束循环。如例5.9〇2)计数法:主要用在循环次数确定的情况下。其基本思想是,设置ー计数变量,每循环一次,计数变量增1(即计ー次数),直到计数变量的值到达指定次数。

第6章函数.根据函数的定义者不同,分为如下两大类:(1)标准函数:系统提供的已定义的函数,一般用户都可以调用。如前面学习过的输入输出函数scanf、printf>getchar>putchar等。TurboC2.0的部分常用库函数见附录D。(2)用户自定义函数:用户自己编写的用来解决具体问题的函数。.根据函数的参数形式,C语言函数又分为如下两种:(1)无参函数: 主调函数并不将数据传送给被调用函数。(2)有参函数:在调用函数时,在主调函数和被调函数之间有参数传递,也就是说,主调函数可以将数据传送给被调用函数使用,被调用函数中的数据也可以带回来供主调函数使用。函数的定义和调用函数定义的一般形式:类型标识符 函数名(形式参数表列)说明部分

执行部分intmax(intx,inty)/・函数首部・intmax(intx,inty)/・函数首部・//・函数体开始・/intz;if(x>y)z=x;/・说明部分・//・执行部分・/elsez=y;return(z);/・函数体结束・/说明:函数定义包括函数首部和函数体两部分。(1)函数首部:函数定义的第一行。2)函数名是函数的标识符,遵循C语言标识符的命名规则,区分大小写。3)函数名后的形式参数表列给出函数的形式参数及其类型说明。形式参数简称形参,形式参数及其类型说明放在函数名后的ー对圆括号中,要特别注意的是,无论函数是否有形式参数,函数名后的圆括号不可省,并且圆括号之后不能接、”。形式参数表列的一般形式如下:形参1类型形参1,形参2类型形参2,…,形参n类型形参nー个函数一旦被定义,就可以在程序的其他函数中使用它,这个过程称为函数调用。.说明(1)在定义函数中指定的形参变量,在未出现函数调用时,它们并不占内存中的存储单元;只有发生函数调用时被调用函数中的形参オ被分配内存单元。调用结束后,形参所占用的内存单元也同时被释放。(2)实参可以是常量、变量或表达式,但必须有确定的值。在调用时将实参的值赋给形参变量。(3)实参与形参的类型应一致。只有字符型和整型可以互相通用。(4)实参变量对形参变量的数据传递是“值传递”,即单向传递,只由实参传给形参,而不能由形参传回来给实参。在内存中,实参变量与形参变量是不同的单元,即使同名,也是不同的单元。形参的值如果发生改变,并不会改变主调函数的实参值。.函数调用方式函数有以下三种调用方式:(1)函数语句:把函数调用作为一个语句,例如:sort();这时不要求函数带回值,只要求函数完成一定的操作。(2)函数表达式:函数出现在一表达式中,这种表达式称为函数表达式。这时要求函数带回ー个确定的值以参加表达式的计算。例如:c=2*max(a,b);(3)函数参数。函数调用作为一个函数的实参。例如:m=max(a,max(b,c));其中max(b,c)是ー次函数调用,它的值作为max另一次调用的实参。1.3函数声明调用用户自定义函数时,一般调用函数和被调用函数应在同一个文件中,在调用函数中对被调用函数返回值的类型、函数名称、函数形式参数的类型进行说明,这种说明称为函数声明。6.3变量的作用域及存储类别.局部变量局部变量是在一个函数内部定义的变量,它只在本函数范围内有效。说明:(1)主函数main中定义的变量也是局部变量,也只在主函数中有效。(2)形式参数也是局部变量,其他函数不能调用。(3)可以在ー个函数内部的复合语句中定义变量,这些变量只在复合语句中有效。(4)不同函数中可以使用相同名字的变量,它们代表不同的对象,互不干扰。.全局变量全局变量是在函数之外定义的变量,从定义变量的位置开始到本源文件结束范围内有效。说明:(1)全局变量可以在函数间传递数据,增加函数间数据联系的渠道。(2)全局变量在程序的整个执行过程中都有效。(3)在同一个源文件中,全局变量与局部变量可以同名,在局部变量的作用范围内,全局变量不起作用。(4)对于全局变量,如果在定义时不进行初始化,则系统将自动赋予其初值,对数值型变量赋。,对字符型赋变量‘、0’。3.2动态变量与静态变量.动态存储方式和静态存储方式(1)动态存储方式。是指在程序运行期间根据需要动态分配存储空间的方式。(2)静态存储方式。是指在程序运行期间分配固定的存储空间的方式。.动态变量以动态存储方式分配的变量称为动态变量,包括所有函数的形式参数、用auto和register声明的局部变量。动态变量一般定义在函数内部(包括定义在函数首部的形式参数),只有当程序进入该函数时才分配存储空间,函数执行完后,变量的存储空间被释放,再次调用该函数时,系统重新分配新的存储空间。动态变量在未被赋初值时,其值为不能确定的随机值。(1)用auto声明的局部变量。用auto声明的局部变量又称动态的局部变量。其声明形式如下:[auto]变量类型变量名;(2)用register声明的局部变量。用register声明的局部变量又称寄存器变量。寄存器变量的值放在CPU的寄存器中,使用时直接从寄存器取出参加运算,不必再到内存中去存取。为了提高执行效率,把程序中使用频率高的变量定义为寄存器变量。其声明形式如下:register变量类型变量名;.静态变量以静态存储方式分配的变量称为静态变量,包括所有的全局变量和用static声明的局部变量。动态变量可以定义在函数外部(如:全局变量),也可以定义在函数内部(如用static声明的局部变量),静态变量在程序执行过程中占有固定的存储空间,只在程序执行结束时释放占用的存储单元。静态变量在未被赋初值时,其值为〇。(1)用static声明的局部变量。用static声明的局部变量又称静态的局部变量。其声明形式如下:static变量类型变量名;静态局部变量的作用域仍然是变量定义所在的函数,即只有当程序进入该函数时,这些变量オ可以使用,离开该函数后就不能使用这些变量了,但不能使用并不代表这些变量不存在,静态局部变量在程序第一次进入定义所在函数时被分配存储空间,函数执行完(所在程序并没有执行完)后,变量的存储空间不释放,再次调用该函数时,变量继续使用所占的存储空间,并保持上次调用所得到的结果。(2)用static声明全局变量。全局变量都是静态存储方式,在ー个文件中定义的全局变量,在其他文件中也可以使用,用static声明全局变量是限制其作用域仅为所在的源程序文件,即不能被其他文件使用。其声明形式如下:static变量类型变量名;用static声明全局变量与用static声明局部变量的形式相同,不同的只是定义位置不同,全局变量定义在函数外部,而局部变量定义在函数内部。(3)用extern声明全局变量。全局变量的作用域从定义变量的位置开始到所在源文件结束,用extern声明全局变量是扩展全局变量的作用域。其声明形式如下:extern[变量类型]变量名;其中,[变量类型]是可省略项。用extern声明全局变量与全局变量的定义是分开的,用extern声明全局变量应放在扩展位置。根据作用域扩展情况的不同,对全局变量进行extern声明的位置也不同。3)用extern声明全局变量。1)在所在源文件的作用域外的某函数内部进行声明,其作用是扩展全局变量的作用域至该函数。2)在所在源文件的作用域外的函数外部声明,其作用是扩展全局变量的作用域,从声明位置至文件结束。3)在多文件程序的另一文件中声明,其作用是扩展全局变量的作用域至声明的文件中4内部函数与外部函数.内部函数内部函数是只能被本文件中的函数调用的函数。其一般定义形式如下:static类型标识符函数名(形参表)2•外部函数外部函数是可以被其他文件中的函数调用的函数。其一般定义形式如下:[extern!类型标识符函数名(形参表)其中,[extern]是可省略项。外部函数可以被其他文件中的函数调用,但在主调用函数所在的文件中要对被调用函数进行声明。其一般声明形式如下:extern类型标识符函数名(形参表)第七章数组数组是内存中的一种数据集合,用于存贮较大量的相同类型的数据元素,在程序中数组有一个名字,并通过下标访问数组的某个元素。7.1一维数组ー、一维数组的定义语法格式:元素类型名数组名[元素个数];如:inta[5],b[8];doubley[15],c[20];#defineN10longpos[N];intc[N+l];/・正确・/例如:intn=如,a[n];/*错误・/二、ー维数组元素的引用语法格式:数组名[下标表达式]如:若有定义inta[4];则元素a[0],a[l],a[2],a[3]是数组的有效元素。a[4]并非有效元素,属于下标超范围。下标超范围会引起死机或程序错误,但C语言不自动检查下标是否超范围,故必须在设计阶段从程序逻辑上保证下标不超范围。ー维数组的元素在内存中是连续存放的。例如:若有inta[10];,则a数组中包含的10个元素在内存中的存储情况如下:如:doublea[5]:该数组共5个元素,存贮5个double型实数,共占用40字节存贮空间。四、ー维数组的初始化在定义数组时,允许对静态(数组定义前加有static保留字)数组、外部数组(定义于所有函数以及复合语句之外)及main。定义的auto型数组进行初始化。初始化格式:static] 类型说明符数组名={常量列表};说明:static与外部数组不初始化,初值自动为〇(2)初始化时,可以不指定元素个数staticinta[]={l,2,3,4};则数组a自动为4个元素,与上面的定义形式完全等价。(3)可以只对前部分元素进行初始化,余下的元素初值自动为。。(main。中的auto型也是这样)如:staticinta[5]={l,2,3};则a[3]与a[4]自动为〇。2二维数组ー、二维数组的定义语法格式:元素类型名数组名[下标1维数][下标2维数];如:inta[5][8]; /*5行?8列整型数组・/又如:#defineN6longm[N][N];/*N行?N列长整型数组・/二、二维数组元素的引用语法格式:数组名[行下标][列下标]其中,下标表达式必须是整型表达式;下标固定从。开始编号。如:若有定义inta[3][4];则左上角元素下标为a[0][0],右下角元素下标为a[2][3]。C语言不自动检查下标是否超范围,故必须在设计阶段从程序逻辑上保证下标不超范围。2.2、二维数组的初始化也只能对static或外部数组、main。中的auto型数组进行初始化。初始化方法:标准形式staticinta[2][3]={{1,2,3},{4}5,6});注意:用内层{}表示行,每行可视作一个ー维数组,并按行初始化。对所有元素初始化可以缺省行数和内层{}如:上述初始化可写为staticinta[][3]={{1,2,3},{4,5,6}}或staticinta[][3]={1,2,3,4,5,6};或staticinta[2][3]={1,2,3,4,5,6};static与外部数组不初始化,初值自动为〇(4)每行可以只对前几列元素进行初始化,余下的元素初值自动为〇〇如:staticinta[][3]={{1},{2,3}};则矩阵元素初值如下:(5)指定行数时,可以只初始化前面几行,余下各行元素初值自动为0.如:staticinta[4][3]={{1},{2}3,4},{5,6}};则矩阵初值如下:例:将下表存入数组a,按行求元素之和并显示。2513 321054 53程序:#include<stdio.h>main(){inta[2][4],i;a[0][0]=25;a[0][l]=13;a[0][2]=32;a[l][0]=10;a[l][l]=54;a[l][2]=53;for(i=0;iく=1;i++)a⑴[3]=a⑴[0]+a⑴⑴+a⑴⑵;for(i=0;iく=1;i++)printf("刎%d%d%d\n",a[i][0],a[i][1],a[i][2],a[i][3]);7.3字符数组7.3.1字符数组的定义、引用与初始化.字符数组的定义ー维字符数组的定义形式如下:char 数组名[常量表达式];例如:chara[10];二维字符数组的定义形式如下:char 数组名[常量表达式1][常量表达式2];例如:chara[3][4];.字符数组元素的引用ー维字符数组元素的引用形式如下:数组名[下标]例如:a[2]a[l+l]二维字符数组的元素的引用形式如下:数组名[行下标][列下标]例如:a[l][O]a[0][3-2]3,字符数组的初始化ー维字符数组的初始化形式如下:[static] 类型说明符数组名={字符常量列表};例如:chara[10]={'H','e','l','l',‘〇',’!'}二维字符数组的初始化形式如下:[static] 类型说明符数组名={{字符常量列表},…};例如:chara[2][3]={{'A','B'},{'C','D'}}说明:(1)如果花括号中提供的字符个数大于数组长度,则作语法错误处理。(2)如果花括号中提供的字符个数小于数组长度,则只将这些字符赋给数组中的前面那些元素,其余元素自动定为空字符(即‘、0')。(3)如果花括号中提供的字符个数与预定的数组长度相同,在定义时可以省略数组长度,系统会自动根据初值个数确定数组长度。7.3.2字符串与字符数组1.字符串和字符串结束标志C语言约定用‘、0'作为字符串的结束标志,它占内存空间,但不计入串的长度。<'〇,的代码值为0。字符型ー维数组来存储ー个字符串,用字符型二维数组来存储多个字符串。3.字符数组与字符串的输入输出(1)用格式符“祝”逐个字符输入输出:(2)用格式符“版”整个字符串输入输出:(1)用%S格式输出字符数组时,遇<\0,结束输出,且输出字符中不包含‘、〇'。(2)若数组中包含一个以上的''0',则遇第一个、0'时结束输出。(3)用%s格式输入或输出字符数组时,函数scanf的地址项、函数printf的输出项都是字符数组名。这时数组名前不能再加&符号,因为数组名就是数组的起始地址。(4)用语句“scanf("版”,s);”为字符数组s输入数据时,遇空格键或回车键时结束输入,但所读入的字符串中不包含空格键或回车键,而是在字符串末尾添加''0'。(5)用一个scanf函数输入多个字符串,输入时应以空格键或回车键作为字符串间的分隔。3.3字符串函数使用字符串函数时应在程序前包含头文件:#includeくstring.h>puts(字符串):字符串输出函数。功能:将一个字符串输出到终端。输出的字符串包含转义字符。示例:charstr[]={"china\nbeijing"};puts(str);输出:chinabeijinggets(字符数组):字符串数组输入函数。功能:从终端输入ー个字符串到字符数组,该函数返回值是字符数组的起始地址。示例:charstr[10];gets(str);如果键盘输入:China则数组str在内存中的存储情况如下:strcat(字符数组1,字符数组2):连接两个字符串函数。功能:连接两个字符串中的字符,把字符串2接到字符串1的后面,结果放在字符串1中,函数调用后得到ー个函数值——字符串1的地址。示例:如果有:charstrl[10]={"Ch"};charstr2[」={"ina"};strcat(strl,str2);则:字符数组strl中存储的字符串为"China”。说明:(1)字符数组1必须足够大,以便能容纳连接后的新字符串。(2)连接前两个字符串后面都有一个‘、〇’,连接时将字符串1后面的‘、〇’取消,只在新串的最后保留一个''〇'。strcpy(字符数组,字符串):字符串复制函数。功能:将字符串拷贝到字符数组中去。示例:如果有:charstrl[10],str2[]={"china"};strcpy(strl,str2);则:字符数组strl中存储的字符串为"China"〇示例:下面的用法是不合法的:strl={"china"};strl=str2;如果用赋值语句,则只能将字符逐个赋给一字符数组元素。示例:chara[6];a[0]-'c;a[l]='h';a[2]='i';a[3]='n';a[4]='a';a[5]=‘、0'strcmp(字符串1,字符串2):字符串比较函数。功能:按ASCH码值大小比较,将两个字符串自左至右逐个字符相比较,直到出现不同的字符或到‘、。’为止。如果全部字符相同,则认为相等;如果出现不相同的字符,则以第一个不相同的字符的比较结果为准。比较的结果由函数值带回。(1)字符串1=字符串2,函数值为〇。(2)字符串1>字符串2,函数值为正整数。(3)字符串1く字符串2,函数值为负整数。strlen(字符数组):求字符串长度函数。功能:求字符串长度。函数值为字符串的实际长度,不包括‘、。’在内。示例:如果有:charstr[10]={"china");printf("%d",strlen(str));则输出结果为:5strlwr(字符串):字符串小写函数。功能:将字符串中的大写字母转换成小写字母。strupr(字符串):字符串大写函数。功能:将字符串中的小写字母转换成大写字母。第8章指针1.1指针的概念.存储单元:构成存储单元的基本单位是字节,不同类型的存储单元由数量不等的连续字节组成,计算机给每个字节ー个惟ー的编号。.指针:构成某一存储单元的连续字节的起始字节编号称为该存储单元的地址,也称为该存储单元对应变量的指针。即:变量的指针就是变量的地址指针变量:存放某ー变量的地址的变量称为指针变量。8.1.2指针变量指针变量的一般定义形式如下:类型标识符 ・标识符;例:int*p;允许指针变量在定义中初始化。例如:inta=5,*p=&a; /*&a是变量a的地址・/其示意图如图所示(图2):注意:此语句是将&a赋给p,而不是・p。8.1.3指针变量的运算1.赋值运算不能直接给ー个指针变量赋ー个整数变量的地址是通过对变量取地址运算得到的。&变量名“&”是对变量取地址运算符,其作用是取得变量所占用的存储单元的地址(构成存储单元的连续字节的首字节编号)。对指针变量的赋值是将另ー变量的地址赋给指针变量。其一般格式有如下四种:①指针变量名=&变量名②指针变量名=指针变量名③指针变量名=指针变量名+整型数据值@指针变量名=指针变量名一整型数据值例如:inta,i=l;int*p,*q,*m,*n;p=&a;q=P;m=p+l;n=q-i;.取指针变量指向的存储单元(或变量)运算・指针数据值如果有:inta;int*p;p=&a;则:*p与a是相同的,表示同一个变量。“&”和“*”互为逆运算,但首先进行的运算是取地址,即“&”运算。如果有:inta=3,b;int*p;p=&a;b=*p;*p=5;则:指针变量P指向变量a;*p(即a)的值赋给b,b的值为3;将5赋给・p(即a),a的值为5。.比较运算当两个基类型相同的指针变量已被正确赋值后,可以对指针变量的值进行比较运算。如果有:inta[6];int*p,*q;p=&a[O];q=&a[5];指针变量P、q的指向如图8-4所示。此时,对p、q进行比较运算,则有:p>q、p>=q、p==q的值为假:pくq、p〈=q、p!=q的值为真。.减法运算两个指针变量在一定条件下,可进行减法运算。设P,q指向同一数组,则p-q的绝对值表示P所指对象与q所指对象之间的元素个数。.指针变量的运算应用举例例8.1输入a和b两个整数,按先大后小的顺序输出a和bo#include<stdio.h>main(){int*pl,*p2,*p,a,b;scanf("%d,%d",&a,&b);pl=&a;p2=&b;if(a<b)(p=pl;pl=p2;p2=p;}printf("a=%d,b=%d\n”,a,b);printf("max=%d,min=%d\n,*pl,*p2);)8.2.1指针与一维数组ー、ー维数组与指针定义一维数组与指针。例:inta[5],*p;则a为首地址常量,其对象类型为int*;a值与&a[0]的值完全相同若有p=a;/*或p=&a[0];*/则有.地址等价关系a+i?p+i?&a[i]?&p[i].对象等价关系*(a+i)?*(p+i)?a[i]?p[i]注意:一维指针变量可以当作一维数组名来引用对象,如:P=a+2;则p[0]?a⑵,p[l]?a[3],二、应用举例例8.2用不同的方法对有!0个元素的整型数组进行输入输出。方法一:下标法。&a[i] a[i]方法二:地址法。a+i *(a+i)方法三:引入指针变量的地址法。int*p;p=a;p+i *(p+i)方法四:引入指针变量的下标法。int*p;p=a;p[i];方法五:指针变量发生变化的下标法。int*p;p=a;p++ *p++注意:p++;/・相当于p=p+l;*/特殊表达式:*p++;和*p—;先取用对象(*p),然后p自加减1++*p;与*++p;完全相同一・P;与・一P;完全相同,这四种形式都是P先自加减1,然后再取用对象8.3.2指针与二维数组ー、二维数组与指针㈠例intb[3][5];可理解为:b是数组名.b是数组首地址.b数组包含三个元素:b[0],b[l],b[2];而每个元素又是一个一维数组.则:b &b[O] 表数组首地址.*bb[O]&b[O][0]代表数组首元素地址.*(b+i) b[i] &b[i][0]代表第i行〇列元素的地址.则:b&b[0]表数组首地址.*bb[0]&b[〇][〇]代表数组首元素地址.*(b+i)b[i]&b[i][0]代表第i行〇列元素的地址.*(b+i)+jb[i]+j&b[i][j]第i行〇列元素的地址注:数组首地址值:b=*b=b[0]=&b[0]=&b[0][0]第i行首地址:b+i=*(b+i)=b[i]=&b[i]=&b[i][〇]㈡二维数组与一级指针变量intb[3][5],*p;一般给P赋初值为数组首元素地址:p=&b[0][0]或p=b[0]或p=*b或p=b;则b[i][j]可用指针表示为:*(p+5*i+j)或p[5*i+j](2)指向ー个由n个元素组成的一维数组的指针变量。又称行指针变量,或数组指针。其定义形式如下:类型说明符(*p)[n];说明:1)类型说明符是指向ー维数组元素的类型。2)该语句定义了一个指针变量p。3)指针变量p的基类型是由n个元素组成的ー维数组类型。(二)二维数组与行指针例:intb[3][5];int(*p)[5];则:b是可以看作是一个二级指针常量;P是可以看作是一个二级指针变量;通常给p赋值为:p=b或p=b+i则P每增1是移动到下一行。则:b[i][j]的地址:*(b+i)+j=b[i]+j=p[i]+j=&p[i][j]=&b[i][j]=*(p+i)+j8.3.3指针数组数组元素为指针类型的数组称为指针数组。指针数组的定义形式如下:类型说明符*标识符[常量表达式];如果有:int*q[3];则指针数组q可以用图8-14所示说明:(1)类型说明符是数组元素存储的地址的基类型。(2)“*”表示数组的元素值是地址,即元素类型为指针类型。(3)标识符是指针数组的名字。(4)常量表达式表示指针数组的大小。此时,二维数组a中任一元素a[i][j]的地址可用指针数组b表示如下:b[i]+j *(b+i)+j相应地,二维数组a中任一元素a[i][j]可用指针数组b表示为:*(b[i]+j)b[i][j] *(*(b+i)+j) *(b+i)[j]注意:(1)从以上用指针数组表示二维数组的形式看,其用法与用数组指针(指向ー维数组的指针)相似,但要注意两者的概念是不同的,指针数组是由多个元素组成的,即有多个变量,指针数组名是ー个地址常量,而数组指针是指向ー维数组的指针,是ー个变量。(2)指针数组和数组指针的定义形式是不同的:int*p[3];定义p是ー个指针数组;int(*p)[3];定义p是ー个数组指针。8.3.4指针与字符串一.用字符指针表示字符串字符指针的定义:char・字符指针变量名;例1:#include<stdio.h>main(){char*str="Iamhappy”;printf("%s",str);)二、?字符数组与指针变量.??赋初值staticcharstrロ="Ilovechina!(静态或外部类)char*a='Tlovechina!(不必要求为静态或外部类).??赋值①char*a; a="Ilovechina!”;(正确)②charstr[14];str="Ilovechina!"(错误).??输入字符串①charstr[10];scanf("如",str);或gets(str);(正确)②char*a;scanf("%s",a);(错误).用指针输入字符串正确的做法应是:charstr[10];char*a;a=str;scanf("%s”,a);gets(a);或a=(char*)malloc(10);scanf("%s",a);.输出字符串①??????char*s="Iamastudentv;puts(s);或printf("%s\n",s);②??????charstr[]="Iamastudent!v;puts(str);或printf("%s\n",str);8.4指针与函数8.4.1指针作函数参数函数的参数不仅可以是整型、实型、字符型等数据类型,还可以是指针类型。指针作函数参数的作用是将一个变量的地址传送到另ー个函数中。例8.8用指针作为函数参数处理:输入两个整数,按先大后小的顺序输出。swap(int*pl,int*p2)intt;t=*pl;*pl=*p2;*p2=t;通过本次函数调用,从被调用函数中带回了两个处理结果.指针作形参,可以带回返回值8.4.2指针函数ー个函数可以带回整型值、实型值、字符型值,也可以带回指针类型的数据,即地址。返回值是指针类型的函数,称为指针函数。指针函数的定义:类型标识符・标识符(参数表);8.4.3函数指针.函数的地址函数在编译时被分配占用一段连续的存储单元,该连续的存储单元的首地址称为函数的地址。在C语言程序中,用函数的名字表示该函数的地址。例:如果有如下函数定义:intsum(intx,inty){intz;z=x+y;return(z);)则函数名sum表示该函数的地址。.指向函数的指针变量(函数指针)将函数的首地址存入ー个指针变量中,该指针变量就被称为指向函数的指针变量,又称为函数指针。函数指针的定义:类型标识符(・标识符)();例如:int(*p)();说明:“类型标识符”是函数指针指向的函数返回值的类型。“标识符”是函数指针(指向函数的指针变量)的名字。”(・标识符)”表示该标识符是ー个指针变量。(4)标识符后的“()”表示该指针变量指向一个函数。函数指针的赋值(将函数指针指向某ー函数):函数指针名=函数名;例如:p=sum;利用函数指针调用其指向的函数:(・函数指针名)()5指向指针的指针存放另一指针变量的地址的指针变量,称为指向指针的指针。指向指针的指针变量的定义:类型标识符**标识符:例如:如果有:int**p,*q,x;q=&x;p=&q;则有如图8-18所示的指针指向。如果将二维数组的每一行的地址存储在ー个指针数组中,再将指针数组的首地址赋给ー个指向指针的指针变量,则也可以使用指向指针的指针变量来处理二维数组。6命令行参数带参数的mainO的函数首部形式如下:main(intargc,char*argv[])说明:(1)第一个形参argc是int类型,保存命令行中字符串的个数。(2)第二个形参argv是指向字符的指针数组,保存命令行中给出的字符串。调用带参数的main。函数的命令行形式如下:命令名 参数1参数2… 参数n注意:命令名、各参数之间用空格隔开。字符串的个数(包括命令名字符串和所有参数字符串,即参数个数n+1)传递给main函数中的第一个参数argc,将命令行中的字符串(同样包括命令名字符串和所有参数字符串)传递给main函数中的第二个参数argvo第9章结构体与共用体1.1结构体类型的定义结构体类型定义的一般形式:struct标识符类型名1成员名1;类型名2成员名2;•••类型名n成员名n;);对某一学生数据(由学生的学号、姓名、性别、年龄、家庭地址等数据项组成)的结构体类型定义如下:structstudentintnum;charname[20];charsex;intage;charaddr[30];9.1.3结构体变量的引用对结构体变量中的成员都可以像同类型的普通变量ー样进行各种运算。例3:a.num=060001+5;b.birthday.day++;(2)结构体变量作为ー个整体引用.结构体变量不可以作为整体进行输入输出,但可以作为函数的参数或返回值而被整体引用,也可以将ー个结构体变量作为ー个整体赋给另ー个具有相同类型的结构体变量。例!.:structstudenta,b;•••a二b;(3)引用结构体变量的地址或成员的地址structstudenta,b;scanf("%d”,&a.num);printf("%x”,&a.num);printf&a);9.1.4结构体变量的初始化结构体变量的初始化形式有如下两种:struct标识符{类型名1成员名1;类型名2成员名2;类型名n 成员名n;}变量名={数据表};(2)结构体类型名变量名={数据表};例2:structstudent{intnum;charname[20];charsex;intage;charaddr[30];);structstudenta={060001,“LiFang",'F',18,"Wuhan"};9.2结构体数组9.2.1结构体数组的定义结构体数组定义的一般形式:结构体类型名数组名[常量表达式];例1:structstudent{intnum;charname[20];charsex;intage;charaddr[30];); /*定义结构体类型structstudent*/structstudenta[5];/・定义a[5]结构体类型structstudent的数组・/9.3结构体指针结构体指针变量:如果用ー个指针变量指向一个结构体变量,即存储该结构体变量所占据的内存单元的起始地址,则该指针变量称为结构体指针变量。结构体指针变量也可以用来指向结构体数组中的元素。结构体指针变量的定义结构体指针变量的定义形式如下:结构体类型名・指针变量名;例如:structstudent*p,a;p=&a;9.3.2引用指针所指向的结构体变量的成员过指针变量引用结构体变量的成员有如下两种方式:(1)(・结构体指针).成员名例如:(*p).num(2)结构体指针ー》成员名例如:p->num3.3指向结构体数组的指针对于已定义的结构体数组,若用ー个变量来存放该结构体数组在内存中的首地址,则该变量为指向结构体数组的指针变量。例如:structstudent*p,a[5];P=a;例9.2用指向结构体数组的指针处理例9.1(按学号顺序整理输出学生情况登记表。)结构体与函数.结构体变量作为函数的形参的三种形式:(1)以结构体变量的成员作为参数,传递结构体变量的成员的值。(2)以结构体变量作为参数,直接传递结构体变量的值。在ANSIC标准中允许用结构变量作为函数的参数进行整体传送,即直接将实参结构体变量的各个成员的值逐个传递给形参结构体变量的对应成员。注意,实参与形参必须是相同结构体类型的变量。(3)以结构体指针作为参数,传递结构体变量的地址。通过结构体变量的整体传递可以实现函数参数的传递,但这要将结构体变量的全部成员逐个传送,特别是成员为数组时将会使传送的时间和空间开销很大,严重地降低了程序的效率。因此最好的办法就是使用指针,即用指针变量作函数参数进行传送。这时由实参传递给函数形参的只是地址,从而减少了时间和空间的开销。例9.3利用函数完成结构体变量的输入输出。(阅读书中程序).结构体类型作为函数的返回值类型其一般定义形式:结构体类型名函数名(形参表)(函数体}例(pl68)链表C语言中,变量存储空间的分配分为静态分配和动态分配两种方式。(1)静态分配方式:先在程序的声明部分进行定义,然后在程序编译时分配适当的存储单元。这些存储单元一经分配,在它的生存期内是固定不变的。(2)动态分配方式:在程序执行期间,通过“申请”分配指定的存储空间来存储数据,当有闲置不用的存储空间时,又可以随时将其释放。前面章节中处理的变量都是在程序的声明部分定义的变量,在程序编译时分配存储单元,是静态分配方式。本章下面要介绍的是通过动态分配方式,在程序执行期间,通过“申请”分配的动态的存储单元,以及动态分配的存储单元构成的“链表”结构。9.5.2动态分配函数malloc函数函数格式:void*malloc(unsignedintsize)函数功能:在内存的动态存储区中分配一个长度为size的存储单元。例1:int*p;long*lp;structstudent*head;p=(int*)malloc(2);/・分配ー个整型存储单元(占用2个字节),用p指向该存储单元・/lp=(long*)malloc(sizeof(long));/・分配ー个长整型存储单元,用1P指向该存储单元,长整型存储单元所占字节数由函数sizeof(long)求得・/head=(structstudent*)malloc(sizeof(structstudent));/*分配ー个structstudent结构体类型的存储单元,用head指向该存储单元・/上述函数sizeof(类型名)求出指定类型的存储单元所占字节数?calloc函数函数格式:voidcalloc(unsignedintn,unsignedintsize);函数功能:在内存的动态存储区域中分配n个长度为size的连续存储单元。形参n和size均为无符号整数,n是连续存储单元的个数,size是ー个存储单元占用的字节数。函数的返回值为分配的连续存储单元的起始地址;如果分配不成功,则返回值为0。例2:int*p;p=(int*)calloc(3,sizeof(int));/*分配3个连续的存储单元,并将其起始地址赋给整型指针变量P*/free函数函数格式:voidfree(void*ptr);函数功能:释放由指针变量ptr指向的内存区域。其中,ptr是一个指针变量,指向最近一次调用函数malloc或calloc时所分配的存储空间的首地址。通过函数free将已分配的内存区域交还系统,使系统可以重新对其进行分配。例3:int*p;p=(int*)calloc(3,sizeof(int));free(p);5.3链表的基本操作.链表节点的定义链表中的任一个节点都包括两个数据项,ー个是节点自身的数据信息,称为节点的数据域,另一个是下ー节点的地址值,称为节点的指针域。structnode(datatypedata;structnode*next;);datatype是数据域的类型,可以是前面所介绍的任意C语言类型。显然,链表节点的指针域存放的地址类型与它自身的类型是相同的。.链表的基本操作链表的基本操作主要有链表的建立、节点的访问、节点的插入、节点的删除等。(1)链表的建立。链表的建立是ー个动态存储空间分配和形成链接关系的过程。用尾插法建立链表的过程如下:1)建立一个空链表,即head二NULL。2)请分配新节点存储单元,对新节点的数据域和指针域赋值。由于新插入的节点总是尾节点,因此,它的指针域的值为空(即NULL)。3)将新节点链接到链表的尾部:4)重复步骤2)~3),继续插入新节点直到结束。(2)链表节点的访问。链表节点的访问过程如下:1)取链表头指针head。2)用ー个指针p指向链表的第一个节点,即p=head。3)访问p所指节点。4)移动指针p,使它指向下ー节点,即p=pー>next。5)重复步骤3)和4),直到指针p为空(3)链表节点的插入。其操作过程主要有两个子过程:①确定插入位置:②插入新节点。插入条件的要求主要有以下几种情况:新节点插入在第i个节点之前(或后)。新节点插入在节点数据等于某一指定数据的节点之前(或后)。新节点插入在ー个节点数据有序的链表中,保证插入新节点后链表仍然有序。下面以新节点插入在节点数据等于某一指定数据的节点之前的情况分例介绍节点插入操作的算法。操作过程如下:1)取链表头指针head。2)申请分配新节点存储单元,对新节点的数据域赋值。3)如果head等于NULL,即链表为空,不存在指定数据的节点,则新节点插入到链表中,成为链表中惟一的节点,即将新节点的地址赋给头指针head,赋新节点指针域的值为NULL。4)如果head不等于NULL,用ー个指针p指向链表的第一个节点,即p=head,判断p所指节点是否为指定节点,如果不是,移动指针p,使它指向它的下ー节点,重复判断过程,直到P所指节点是指定节点或P所指节点的指针域的值为NULL〇5)如果p所指节点是指定节点,将新节点插入在P所指节点之前,即P的前ー节点的指针域的值为新节点的地址,新节点的指针域的值为Po6)如果p所指节点不是指定节点,但p所指节点的指针域的值为NULL,则链表中不存在指定数据的节点,新节点插入到链尾,即P所指节点之后,赋P所指节点的指针域的值为新节点的地址,新节点指针域的值为NULLo7)返回操作后链表的头指针。下面以新节点插入在节点数据等于某一指定数据的节点之前的情况分例介绍节点插入操作的算法。操作过程如下:1)取链表头指针head。2)申请分配新节点存储单元,对新节点的数据域赋值。3)如果head等于NULL,即链表为空,不存在指定数据的节点,则新节点插入到链表中,成为链表中惟一的节点,即将新节点的地址赋给头指针head,赋新节点指针域的值为NULL。4)如果head不等于NULL,用ー个指针p指向链表的第一个节点,即p=head,判断p所指节点是否为指定节点,如果不是,移动指针p,使它指向它的下一节点,重复判断过程,直到P所指节点是指定节点或P所指节点的指针域的值为NULL。5)如果p所指节点是指定节点,将新节点插入在P所指节点之前,即P的前ー节点的指针域的值为新节点的地址,新节点的指针域的值为P。6)如果p所指节点不是指定节点,但p所指节点的指针域的值为NULL,则链表中不存在指定数据的节点,新节点插入到链尾,即P所指节点之后,赋P所指节点的指针域的值为新节点的地址,新节点指针域的值为NULLo7)返回操作后链表的头指针。9.6.1共用体类型的定义其一般形式为:union标识符{类型名1 成员名1;类型名2 成员名2;・・・类型名n成员名n;);说明:(1)union是关键字,是共用体类型的标志。(2)标识符是共用体名,是用户自己定义的标识符,与关键字union共同构成共用体类型名。(3)花括号“什”中是组成该共用体类型的成员数据项,或称为共用体中的分量,由成员类型和成员名组成。(4)共用体成员的数据类型可以是简单类型、数组、指针或结构等。(5)共用体类型的长度是共用体成员中的最大长度。共用体变量定义的一般形式:共用体类型名变量名表;共用体变量的定义有如下三种处理方式:(1)先定义共用体类型,再定义共用体变量。(2)在定义共用体类型的同时定义共用体变量。引用形式如下:共用体变量名.成员名例如:unionxy{charch;inta[3];floatb;}x,y;x.ch='m';y.a[0]=20;说明:(1)对同一共用体的不同成员进行赋值后,共用体变量中存储的是最后一次成员的赋值。(2)不能直接使用共用体变量名进行输入输出。(3)可以直接使用共用体变量名对ー个同类型的共用体变量赋值。(4)共用体变量名可以作为函数参数。(5)不能对共用体变量进行初始化。(6)可以定义共用体类型的数组。(7)可以定义共用体类型的指针,也可以使用共用体类型的指针作函数参数。引用指针指向共用体的成员同样使用运算符“ー〉”9.7枚举所谓枚举,是将具有相同属性的ー类数据值ーー列举。枚举是ー个已命名的一组常量的集合。例如:表示星期的(标识符常量)Sunday,Monday,Tuesday,Wednesday,Thursday,Friday,Saturday就是ー个枚举。枚举是C语言中的简单类型而非构造类型,它的值域是有穷的,可以ーー列举出来,变量的取值只限于列举出来的值的范围。其形式为:enum枚举名{标识符1口整型常数],标识符2匸整型常数],・・・标识符nロ整型常数],);说明:(I)enum是关键字,是枚举类型的标志。(2)标识符是枚举名,是用户自己定义的标识符,与关键字enum共同构成枚举类型名。(3)花括号“{}”中的“标识符1,标识符2,…,标识符n”是所定义枚举类型的全部取值,通常将这些标识符称为“枚举元素”或“枚举常量”。这些标识符是用户定义的标识符,一般是所代表事物的名称。(4)枚举中每个标识符后的结束符是、”,而不是、”,最后ー个标识符后可省略、”。(5)如果枚举没有初始化,即省掉“=整型常数”时,则从第一个标识符开始,顺次赋给标识符整型常数。,1,2,…。但当枚举中的某个标识符被赋值后(可以赋负数),其后的标识符按依次加1的规则确定其值。9.7.2枚举变量的定义枚举变量定义的一般形式:枚举类型名变量名表;枚举变量的定义有如下三种处理方式:(1)先定义枚举类型,再定义枚举变量。(2)在定义枚举类型的同时定义枚举变量。9.7.3枚举变量的应用(1)枚举变量取枚举说明结构中的某个标识符常量后,其值可认为是标识符对应的常数。(2)不能直接给ー个枚举变量赋ー个整数,但经过强制类型转换后可以实现赋值。第10章编译预处理与位运算10.1编译预处理编译预处理:是在编译前由编译系统中的预处理程序对源程序的预处理命令进行加工。源程序中的预处理命令均以“ザ’开头,命令末尾不加分号,它们可以写在程序中的任何位置,作用域是从出现位置开始到源程序的结束.1.1宏定义宏定义是定义ー个标识符来代替一个字符串。宏定义有不带参数的宏定义和带参数的宏定义两种。.不带参数的宏定义定义形式:ttdefine标识符字符串功能:用ー个指定的标识符(即名字,称为宏名)来代表一个字符串。例如:#definePI3.1415926说明:(1)与其他标识符相区别,宏名一般用大写字母表示。(2)编译预处理时,将程序中的宏名用字符串代替,这种将宏名替换成字符串的过程称为“宏展开”。(3)使用宏可以减少程序中重复书写或修改某些字符串的工作量.(4)在程序中出现在双引号中或其他字符串中与宏名相同的字符串,不能作为宏处理。(5)^define命令的作用范围从定义位置至源程序结束,但可以用#undef终止其作用域。(6)宏定义时,可以引用已定义的宏名,编译时层层展开。例3:#definePI3.1415926#defineR3.0#defineL2*PI*R^defineXR+Lmain()y=2*X;展开main()y=2*3.0+2*3.1415926*3.0;2.带参数的宏定义定义形式:#define标识符(参数表)字符串功能:用指定的带参数的标识符来代表一个字符串。注意:带参数的宏展开时要用实参字符串替换形参字符串。例4:#defineS(x)2*x*xmain()y=S(2+2);main()y=2*2+2*2+2;注意:展开时用实参字符串2+2替换形参字符串x,2+2是字符串,不能看做表达式,即S不能展开为2*(2+2)*(2+2)〇10.1.2文件包含文件包含是ー个源程序通过#include命令把另外一个文件的全部内容嵌入到源程序中。文件包含命令有如下两种格式:includeく文件名〉include”文件名”功能:将指定文件的全部内容放到该命令行所在的位置。说明:命令#includeく文件名)在搜索文件时只检索C语言编译系统所确定的标准目录,而命令#include"文件名"在搜索文件时首先对使用包含文件的源程序文件所在的目录进行检索,若没有找到指定的文件,再在标准目录中检索。10.2位运算数据在计算机内部是以二进制补码形式存储的。.按位与运算符:&若参与运算的两个操作数对应的两个二进制位都是1,则对应位结果为二进制位1,否则为〇。例1:求5&3的值。运算过程如下:0000000000000101(5的补码)& 0000000000000011(3的补码)0000000000000001(1的补码,即5&3=1).按位或运算符:丨若参与运算的两个操作数对应的两个二进制位有一个为1,则对应位结果为二进制位1,否则为〇。例2:求5|3的值。运算过程如下:0000000000000101(5的补码)| 0000000000000011(3的补码)0000000000000111(7的补码,即5|3=7).按位异或运算符:若参与运算的两个操作数对应的两个二进制位相异(ー个为1,另ー个为0),则对应位结果为二进制位1,否则为〇。例3:求5へ3的值。运算过程如下:0000000000000101(5的补码)0000000000000011(3的补码)0000000000000110(6的补码,即5へ3=6).按位取反运算符:〜“〜”的操作数只有一个,若操作数的某二进制位为1,则对应位结果为〇,若操作数的某二进制位为〇,则对应位结果为1,例4:求〜5的值。运算过程如下:〜0000000000000101(5的补码)1111111111111010(-6的补码,即〜5=-6).左移运算符:«左移运算的一般形式为:操作数«移位位数功能:将一个操作数的所有二进制位依次左移若干位,高位移出并舍弃,低位补〇。例5:求5くく3的值。运算过程如下:0101(5的补码)«30101000(40的补码,即5くく3=40).右移运算符:»左移运算的一般形式为:操作数»移位位数功能:将一个操作数的所有二进制位依次右移动若干位。若操作数为无符号数或正数,移出的低位被舍弃,高位补。。这种移位操作又称逻辑右移。若操作数为有符号数的负数,即最高位为1时,右移时高位补1,以保持符号位不变,低位移出并舍弃。这种移位操作又称算术右移。例6:求5>>1的值。运算过程如下:0000000000000101(5的补码)»1000000000000001

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论