收藏 分销(赏)

软考程序设计和程序设计语言知识点汇总.docx

上传人:二*** 文档编号:4546794 上传时间:2024-09-27 格式:DOCX 页数:30 大小:38.64KB
下载 相关 举报
软考程序设计和程序设计语言知识点汇总.docx_第1页
第1页 / 共30页
本文档共30页,全文阅读请下载到手机保存,查看更方便
资源描述
软考程序设计和程序设计语言知识点汇总 函数定义 在C程序设计中,将完成指定功能的C代码定义成函数,变成逻 辑上一个相对独立的程序单位。函数定义需要指明函数返回值的类 型、函数名、函数的形式参数(常简称形参)和函数体(包括说明和定 义及语句序列)。函数定义的一般形式为存储类型说明符数据类型说明符函数名(形式参数表) 形式参数说明序列( 说明和定义部分执行语句序列 } 存储类型说明符或省缺,或为static.省缺表示一个全局函数, static表示一个静态函数,只供同一源程序文件中的函数使用。 数据类型说明符用来指定函数返回值类型,可以是基本数据类 型、某种指针类型、结构类型等。但不可以是数组类型。特别当函数 不返回结果时,可用void明确指明函数不返回值。 数据类型说明符也可省缺,省缺被默认为返回int型值。 函数名是一个标识符。形式参数表是用远号分隔的若干形式参 数,用不同的标识符指明各形式参数的名。形式参数说明序列用来说 明各形式参数的数据类型,相同数据类型的形式参数可以一起说明。 现在编写C程序的习惯是形式参数说明序列直接放在形式参数表中, 一个有8个有效字符的字符串,其长度为8个字符,但在它的第九个位置存有结束标记符'\0'. 请读者注意以下几点: (1) 字符率与存储字符串的字符数组有区别。字符率的有效字符 是指从所指位置的第一个字符开始至字符串结束标记符之前的那些 字符。格式符“%s”只输出字符串的有效字符,而不会再继续输出字 符率结束标记符及其之后的字符。例如,char str[50]= "Pas\0cal Cobol Fortran C” ; printf( "%s\n" , str); 将只输出:Pas而实际上,数组str□字符率结束符之后还存有其它许多字符。 (2) 用“%s”格式输出字符串时,不包括字符串结束标记符。对 应的输出项是字符串或字符串名。字符数组名可作为字符串名。对于 上例,写成printf ( "%s" , s[0]); 是错误的。因s[0]是数组s的元素,是一个字符,不是字符串。 (3) 在调用scanfO为字符数组输入字符串时,输入项是数组名, 不要加地址运算符&. (4) 若用“%c”格式结合循环输入字符序列,若程序又想将输入的字符序列构成字符串,则程序必须用赋值语句在字符列之后存入字 符串结束标记符,使其变成字符串。 程序经常要处理许许多多的字符串,如存储星期的名称。同时存储众多字符串的一个实现方法是定义一个二维字符数组,让二维数组 的每一行存储一个字符串。这样做,要求数组每行元素个数应比可能 最长的字符串字符个数还要多1个。如下面的示例所示: char weekDay[] [9] = ( "Sunday" , "Monday" , "Tuesday", “Wednesday",“Thursday” , “ Friday" , “Saturday” ); 在C程序中,存储多个字符串更好的方法是用指针数组。. 字符串 称最后有字符率结束符'\0'的字符序列为字符串。字符数组中存 储的字符序列本身并不要求最后一定要有字符'\0'.但当字符数组内 存储的内容需要作为字符串时,就必须要有标记符当字符数组内 存储的是字符串时,可用“%s”格式输出,若是普通的字符序列,则 它不能用格式“%s"输出,而只能结合循环用格式“%c"输出。 指定元素个数的字符数组用字符串常量给它初始化时,其元素个 数不能小于字符串常量的字符数,但数组的元素个数可以等于字符串 常量的字符数。例如,char ss[3]= "abc"; 则,ss[0] = 'a*, ss[l] = *b', ss[2] = 'c'.此时,字符数组 ss 中存储的是字符序列,不是字符串。 字符率结束标记符的代码是8位全0,称为空字符,程序用'\0' 来标记。字符串的结束标记符紧接在字符串的有效字符列之后。例如, 一个有8个有效字符的字符串,其长度为8个字符,但在它的第九个位置存有结束标记符'\0'. 请读者注意以下几点: (1) 字符率与存储字符串的字符数组有区别。字符率的有效字符 是指从所指位置的第一个字符开始至字符串结束标记符之前的那些 字符。格式符“%s”只输出字符串的有效字符,而不会再继续输出字 符率结束标记符及其之后的字符。例如,char str[50]= "Pas\0cal Cobol Fortran C"; printf( "%s\n" , str); 将只输出:Pas。而实际上,数组str□字符率结束符之后还存 有其它许多字符。 (2) 用“%s”格式输出字符串时,不包括字符串结束标记符。对 应的输出项是字符串或字符串名。字符数组名可作为字符串名。对于 上例,写成printf ( "%s" , s[0]); 是错误的。因s[0]是数组s的元素,是一个字符,不是字符串。 (3) 在调用scanfO为字符数组输入字符串时,输入项是数组名, 不要加地址运算符&. (4) 若用“%c”格式结合循环输入字符序列,若程序又想将输入 的字符序列构成字符串,则程序必须用赋值语句在字符列之后存入字 符串结束标记符,使其变成字符串。 程序经常要处理许许多多的字符串,如存储星期的名称。同时存 储众多字符串的一个实现方法是定义一个二维字符数组,让二维数组的每一行存储一个字符串。这样做,要求数组每行元素个数应比可能 最长的字符串字符个数还要多1个。如下面的示例所示: char weekDay[] [9] = ( "Sunday”,“Monday” , “Tuesday", “Wednesday","Thursday” , “ Friday" , "Saturday" }; 在C程序中,存储多个字符串更好的方法是用指针数组。. 一维数组元素的引用程序定义了数组后,就可引用数组的元素。引用数组元素的一般 形式为数组名[下标] 其中下标可以是整型常量、整型变量或整型表达式。例如,数组a的五个元素可分别用a[0] > a[l] > a[2] > a[3]、a[4]来引用它们。 设有定义: int x[20], i;以下代码实现顺序输入数组X的全部元素: for(i=0; i<20;i++)scanf( "%d” , &x[i]); 一维数组的初始化 可在数组定义同时,给出数组元素的初值。这种表述形式称为数 组初始化。数组初始化可用以下几种方法实现: (1) 数组定义时,顺序列出数组全部元素的初值。例如,int d[5] = (0, 1, 2, 3, 4}; 将数组元素的初值依次写在一对花括弧内。经上面定义和初始化 之后,就有 d[O]=O.d[l]=l. d[2]=2、d[3]=3、d[4] =4. (2) 只给数组的前面一部分元素设定初值。例如, int e[5] = (0, 1, 2); 定义数组e有5个整型元素,其中前三个元素设定了初值,而后 两个元素末明确地设定初值。系统约定,当一个数组的部分元素被设 定初值后,对于元素为数值型的数组,那些末明确设定初值的元素自 动被设定0值。所以数组e的后两个元素的初值为0.但是,当定义 数组时,如未对它的元素指定过初值,对于内部的局部数组,则它的 元素的值是不确定的。 (3) 当对数组的全部元素都明确设定初值时,可以不指定数组元素的个数。例如, int g[] = (5, 6, 7, 8, 9);系统根据初始化的花括号内的初值个数确定数组的元素个数,所 以数组g有五个元素。但若提供的初值个数小于数组希望的元素个数 时,则方括号中的数组元素个数不能省略。如代码intb[10] = (l, 2, 3, 4, 5}定义数组b有10个元素,前五个元素如设定所示,后五个 元素都为0.反之,如提供的初值个数超过了数组元素个数,就是一 个错误。 字符数组如果数组的元素类型是字符型(char),则此数组就是字符数组。 字符数组的每个元素只能存放一个字符(存放字符的ASCII代码)。 字符数组的定义形式与其它数组的定义形式一样: char字符数组名[元素个数]; 例如,char S[5]表示数组S有五个元素,每个元素能存放一个 字符,整个数组最多可存放五个字符。字符数组元素的引用方法也与 普通数组元素的引用方法相同。 字符数组也可与普通数组一样的初始化,字符数组也可利用字符 串常量给字符数组初始化。例如,char aStr[] = ( "12345" };并可省略花括弧,简单地写为char aStr[]= " 12345” ; 注意:字符数组aStr□的元素有六个,不是五个。用字符串常 量对字符数组初始化,C系统会在字符列末尾添加一个字符串结束 符。 语句其中的语句是for语句的循环体。输语句的执行过程是: (1) 计算表达式1;计算表达式2的值,并测试其值为0或非0.若值为非0, 转步骤3;否则结束for语句;执行循环体;. (2) 计算表达式3;⑸转向步骤2. for语句的一般形式也可等价地用以下形式的while语句来表达: 表达式1; while(表达式2) (语句 表达式3; 由for语句的执行过程可知,for语句的表达式1的作用是对控 制循环的有关变量赋初值;表达式2是控制循环的条件;表达式3用于 修正有关变量;语句是循环体。所以for语句按各部分的功能,可以 形象地写成以下形式: for (赋初值的表达式;控制循环条件的表达式;修正变量的表达 式)完成循环计算的语句 正确使用for语句,需注意以下几种情况: (1)for语句的一般形式中,表达式1、表达式2和表达式3都可以省略。如表达式1省略,表示该for语句没有赋初值部分,或前 面的程序段已为有关变量赋了初值,或确实没有特别的初值;如表达 式2省略,表示循环条件永远为真,可能循环体内有控制转移语句转 出缺语句;表达式3省略,表示没有修正部分,对变量的修正已在循 环体内一起完成。不管表达式1、表达式2和表达式3省略情况如何, 其中两个分号都不能省略。对于三个表达式都省略情况,for语句呈 以下形式:for(;;)语句 (2)表达式1、表达式2和表达式3都可包含逗号运算符由多个表达式组成。 多分支选择语句 多分支选择结构通常有n(>2)个不同情况和n+1个供选择的分 支。多分支选择结构也可用前叙述的嵌套if语句来描述,但因if 语句嵌套深度太多不便于程序编写,也不便于理解,为此C语言专门 提供了 一种实现多分支选择结构的语句,这就是switch语句。它的 一般形式是: switeh(表达式){case常量表达式1:语句序列1 case常量表达式1:语句序列2case常量表达式n:语句序列n defalt:语句序列n+1对switeh语句需说明以下几点: (1)switch后面括号内的表达式只限于是整型表达式或字符型表达式或枚举型表达式。 (2) case后的常量表达式称为情况前缀,要求所有常量表达式的值互不相同,并与switch后面括号内的表达式值的类型相一致。 (3) 语句序列由任意条合法的C语句构成,也可以没有语句。 (4) 情况前缀default可以缺省,但至多出现一次,习惯总是将它写在全部情况前缀之后,如有必要也可写在某case之前。 switch语句的执行过程解释如下: 先计算表达式的值,以该值依次与各case之后的常量表达式的 值比较,按下列规则,选择执行的入口: 如果表达式的值等于某个常量表达式的值,switch语句就从该常量表达式之后的语句序列的第一个语句开始执行,然后一直向下执 行,或自动依次进入后继常量表达式之后的语句序列继续执行(如没 有break语句),或执行完语句序列n+1,结束switch语句的执行; 或在执行某个语句序列过程中遇到转出该switch语句的语句(如break语句),就停止向下执行,结束switch语句的执行。 如果没有相匹配的常量表达式,就从以default为情况前缀的语句序列开始执行。 如果没有相匹配的常量表达式,也没有defaul情况前缀,则该 switch语句的这次执行立即结束。 由上述解释可知,“case常量表达式'‘只是起语句序列入口的 作用。在执行switch语句时,根据switch之后的表达式的值找到与 该值匹配的入口,就从此人口处开始执行,只要未遇到转出该switch 语句的break语句或goto语句,就一直向下执行,也不再理会经过 的case后的常量表达式。 如果要使各种情况互相排斥,仅执行各case所对应的语句序列, 最常用的办法是使用break语句,各语句序列都以break语句结束。 在switch语句中,执行break语句将使控制转向switch语句的后继 语句。 由于switch语句的表达式不允许是实型的,当应用于实型值选择情况时,通常需作以下处理:将实表达式乘上一个适当的比例因子, 使较大的实表达式值映照到一个较小的范围上,然后再将它转换到整 型。 break语句 break语句除能用于switch语句外,还常用于循环语句中。执 行循环结构中的break语句,控制就从包含它的循环结构中退出。 break语句通常与if语句结合,构成一个结束循环的条件。 for语句 for语句是C语言中最灵活、使用最广泛的循环结构语句。如以 最一般意义下考虑循环,一个完整的循环应包含对有关变量赋初值部 分、控制循环的条件、一个要循环计算的操作、每次循环后对有关变 量的修正等四部分组成。拉语句就是从这一般意义下表达循环结构的 语句。 for语句的一般形式为for (表达式1;表达式2;表达式3)顺序结构 顺序结构用来描述一个计算或操作序列,表示从序列的第一个计算开始,顺序执行序列中的每个计算,直至序列的最后一个计算。通 常,一个复杂的计算过程不能用一个简单的计算来表达,而需把复杂 的计算描述成简单计算的序列。 1. 复合语句在C语言中,将顺序执行的语句序列,用花括号括起来,构成C 语言的复合语句。在逻辑上视复合语句为单个语句,它也能用作其它即在形式参数说明表中顺序列出各形式参数的数据类型和形式参数 的名称。如是这样,一般形式的第一行全部内容称为函数头,也称为 函数模型。 特别情况,函数可能不设形式参数,也就没有形式参数表和形式 参数说明序列。但函数名后的一对圆括号是不可以没有的。 一对花括号括住的部分称为函数体,函数体包括类型说明、变量 定义和函数的执行语句序列。在函数体内可以有return语句终止函 数的执行。如函数有返回值类型,则return语句中一定要有表达式, 作为函数调用的返回值。 多级指针 当指针变量PP所指的变量ip又是一种指针时,呷就是一种指向 指针的指针,称指针变量如是一种多级指针。定义指向指针变量的指 针变量的一般形式为数据类型* *指针变量名; 例如,int * *pp, *ip , i ; ip=&i;pp=&ip; 定义说明PP是指向指针的指针变量;它能指向的是这样一种指 针对象,该指针对象是能指向int型的指针变量。如上述代码让pp 指向指针变量ip,中指向整型变量i. 多级指针与指针数组有密切的关系。若有指针数组:结构语句的成分语句。在很多场合,复合语句内还会包含其它结构语 句。 表达式语句 在顺序结构中,最频繁使用的是表达式之后接上一个分号。例如,在赋值表达式之后接上分号,完成用表达式的值更新某变量,习惯称 这种表达式语句为赋值语句;在函数调用之后接上分号,完成指定的 计算功能,习惯称这种表达式语句为函数调用语句。 常用输入输出库函数最基本的输入输出库函数有字符输入函数、字符输出函数、 格式输入函数和格式输出函数。 1. 字符输入函数字符输入函数getchar()的功能是从标准输入设备上(通常 是键盘终端)读取一个字符。该函数没有参数,对它的每次调用,就 返回下一个输入字符的ASCII代码值。例如,执行语句 ch=getchar(); 使变量ch得到输入字符的ASCII代码值。一般情况下,这 里的变量ch为char型或int型。当程序在输入字符后,用ch判定 输入文件是否结束时,变量ch必须是int型的。这是因为文件结束 标记值是T,是int型的。程序中常用EOF表示当前读人字符是文件 结束标记,常量名EOF在文件Stdio. h中被定义为一 1. 2. 字符输出函数 字符输出函数ptuchar 0有一个字符的ASCII代码值参数,函数调用putchar (ch)的功能是将以出值为其ASCII代码的字符输 出到标准输出设备(通常是终端显示屏)上。这里ch可以是char型或 int型数据。 3. 格式输入函数 格式输入函数scanfO的作用是从标准设备读人字符序列, 按格式控制字符率所包含的格式解释输入字符序列,并将解释结果存 储到对应的变量中。调用格式输入函数scanfO的一般形式为 scanf(格式控制字符串,变量地址,变量地址,……) 格式控制字符串是字符串表达式,通常是由一对双引号括起 来的字符串常量,直接用于解释输入字符序列。格式控制字符率可以 包含: 空白类字符(空格符或制表符),它们使输入跳过空白类字符,直到遇到下一个非空白类字符。 「通字符(不包括%),它们要求输入字符流中下一个字符与它相同。 格式转换说明,以字符开头至输入格式符结束的字符 序列组成。格式转换说明引导对下一输入字符段进行转换。 格式转换说明的一般形式为%[w] [h/1/L]输入格式符 输入格式符共有14个,有12种不同输入格式,其中大纲要 求掌握的7种输入格式符的意义见表3. 1.用方括号括住的内容是输 入格式修饰说明,可以缺省,它们的意义是: (D*——星号(赋值抑制符),对应的输入数据项按格式要求 被输入,但结果不存储。带星号的格式转换说明不对应变量地址。用 它来跳过一个输入数据项。 (2)一一整型常数(域宽说明),表示输入数据项的字符段的 有效字符数。若实际输入字符段的字符数小于W,以实际有效字符为 准。 对于数值数据输入格式来说,输入域定义为从下一个非空白类字符起(因此可能跳过若干个空格符、制表符、换行符),到一个与 数值数据相矛盾的字符,或直到输入了指定个数的字符数;对于字符 率输入格式来说,输入域定义为从下一个非空白类字符起,输入非空 白类字符,直至遇到空白类字符,或直到输入了指定个数的非空白字 符。 (3) h/1/L长度修饰符,指明输入数据项的存储类型。 h修饰格式符d, o, X时,表示输入的整数按短整型存储。 1修饰格式符d, 0, X时,表示输入的整数按长整型存储。 1修饰格式符e, f时,表示输入的实数按double型存储。 缺省时,对于格式符d, o, x,表示输入的整数按int整型 存储;对于格式符e, f,表示输入的实数是按float型存储。 常用输入输出库函数 最基本的输入输出库函数有字符输入函数、字符输出函数、格式 输入函数和格式输出函数。 1. 字符输入函数 字符输入函数getchar()的功能是从标准输入设备上(通常是键 盘终端)读取一个字符。该函数没有参数,对它的每次调用,就返回 下一个输入字符的ASCII代码值。例如,执行语句ch=getchar (); 使变量ch得到输入字符的ASCII代码值。一般情况下,这里的 变量ch为char型或int型。当程序在输入字符后,用ch判定输入 文件是否结束时,变量ch必须是int型的。这是因为文件结束标记 值是T,是int型的。程序中常用EOF表示当前读人字符是文件结束 标记,常量名EOF在文件Stdio. h中被定义为-1. 2. 字符输出函数 字符输出函数ptuchar ()有一个字符的ASCII代码值参数,函数 调用putchar (ch)的功能是将以出值为其ASCII代码的字符输出到 标准输出设备(通常是终端显示屏)上。这里ch可以是char型或int 型数据。 3. 格式输入函数 格式输入函数scanfO的作用是从标准设备读人字符序列,按格 式控制字符率所包含的格式解释输入字符序列,并将解释结果存储到 对应的变量中。调用格式输入函数scanf ()的一般形式为scanf (格式控制字符串,变量地址,变量地址,……) 格式控制字符串是字符串表达式,通常是由一对双引号括起来的字符串常量,直接用于解释输入字符序列。格式控制字符率可以包含: s, 空白类字符(空格符或制表符),它们使输入跳过空白类字符,J 到遇到下一个非空白类字符。 普通字符(不包括%),它们要求输入字符流中下一个字符与它相同。 格式转换说明,以字符开头至输入格式符结束的字符序列 组成。格式转换说明引导对下一输入字符段进行转换。. 格式转换说明的一般形式为%[*] [w] [h/1/L]输入格式符 输入格式符共有14个,有12种不同输入格式,其中大纲要求掌 握的7种输入格式符的意义见表3. 1.用方括号括住的内容是输入格式修饰说明,可以缺省,它们的意义是: (D*——星号(赋值抑制符),对应的输入数据项按格式要求被输 入,但结果不存储。带星号的格式转换说明不对应变量地址。用它来 跳过一个输入数据项。 (2)——整型常数(域宽说明),表示输入数据项的字符段的有效 字符数。若实际输入字符段的字符数小于W,以实际有效字符为准。 对于数值数据输入格式来说,输入域定义为从下一个非空白类字符起(因此可能跳过若干个空格符、制表符、换行符),到一个与数值 数据相矛盾的字符,或直到输入了指定个数的字符数;对于字符率输 入格式来说,输入域定义为从下一个非空白类字符起,输入非空白类 字符,直至遇到空白类字符,或直到输入了指定个数的非空白字符。 (3)h/1/L长度修饰符,指明输入数据项的存储类型。 h修饰格式符d, o, X时,表示输入的整数按短整型存储。 1修饰格式符d, 0, X时,表示输入的整数按长整型存储。 1修饰格式符e, f时,表示输入的实数按double型存储。 缺省时,对于格式符d, o, x,表示输入的整数按int整型存储; 对于格式符e, f,表示输入的实数是按float型存储。 格式输出函数 格式输出函数printfO的作用是将输出项接指定的格式排版输 出到标准设备上(通常是终端显示屏)。调用printf ()函数的一般形 式为printf(格式控制字符串,表达式,表达式,) 其中格式控制字符率是字符串表达式,通常是由用一对双引号括 起来的字符串常量。它包含三类字符:普通字符、转义字符和格式转 换说明,它们的作用分别如下: (1) 普通字符,要求按原样输出。 (2) 转义字符,要求技转义字符的意义输出,如,表示输 出时回车换行,'\b'表示退格等。 (3) 格式转换说明,以字符%开头至格式符结束的字符列组成,其 一般形式为%e-j r+j rj 伐」rw][0 P]eh/i/l]输出格式符 其中用方括号括住的内容是格式修饰说明,可以缺省(不出现), 如“%d”、"%7.5f”等。每个格式转换说明对应一个输出项,输出 项可以是常量、变量或表达式。格式转换说明的作用是将对应输出项 的内容按格式符要求产生出字符列,并按格式修饰说明排版输出。 输出格式符共有16个,有12种不同的格式,考试大纲只要求九种。 常用输出格式符表 格式符意义d或i整型数据以十进制形式输出 o无符号整型数据以八进制形式输出X无符号整型数据以十六进制形式输出 U元符号整型数据以十进制形式输出C字符的ASCII码数据,输出对应的字符 S输出字符串f以“整数部分。小数部分"形式输出实型数据 e以[-]n. nnnnne + xx输出实型数据g以f或e格式输出 说明:(l)x格式符同。格式符一样,把符号位作为数的一部分 输出。对于x格式,用字符a、b、c、d、e、f (或A、B、C、D、E、 F)表示9之后的六个十六进制数字符。 (2) -个整数,只要它的位在0-255范围内,也可以用字符形式 输出,输出以该整数为ASCII代码的字符。反之,一个字符数据也可 以用整数形式输出,输出该字符的ASCII代码值。 (3) f、e和g格式符用于输出实型数据,格式转换时有四舍五人 处理。对于f格式,小数点后的数字个数可由格式修饰说明p指定, 若p为0,不显示小数点。用e格式输出时,对于非0实数,小数点 前有一位非零数字,输出格式中的有效位数可由格式修饰说明p指定;字符e(或E)之后是指数,指数部分至少包含两个数字。若输出值的 绝对值不小于1E+100,则指数部分多于两位数字。 g格式能根据表示数据所需字符的多少自动选择f格式或e(或 E)格式输出实数,选择是以输出时所需字符数多少为标准。 格式修饰说明有七种,教材只介绍其中四种,它们的意义分别说 明如下: (1)w域宽说明,w是一个十进制整数,表示输出字段的字符数。 若转换后需要的字符个数比给出的W多,则以实际需要为准;若转换 后需要的字符数比W少,就在左边用填充字符补足(若给出左边对齐 标志(-),则在右边补填充字符人通常用空白符作填充字符,若十进 制整数W之前有前导0(此0不表示以八进制数给出字段宽度),则以 字符0作填充字符。 (2)-左对齐标志,当转换后字符个数少于W时,在W所限定的 字段宽度内,转换所得字符列左对齐,右边补填充符。缺省时,右对 齐,左边补填充符。 (3)0 p,其中p也是十进制整数。 对于g或e格式输出,p指明输出精度(有效数字位数),可以缺 省,缺省值依赖于系统的规定(下面的例子设p的缺省值为6)。 对于f格式输出,p指明输出字符列的小数点之后的数字个数, 可以缺省。 对于S格式输出,p指明最多输出字符率的前p个字符,多余截断。缺省时,字符串的内容全部输出。 对于d.i、0、u、x和X,表示至少出现的数字个数。 同域宽说明一样,p也可以是字符*,而实际值由后面一个输出 项的整数值给出,若该值为负值,相当于没有给出p. (4) 1指明输出项的类型。 长度修饰符1用于格式符d、i、o、u、X,表示对应的输出项是 长整型或无符号长整型。 以下是格式输出的一些例子。例如,int i=1234; long j=1234567L;printf( "%d, %+6d, d, %-6d, %51dw , i, i, i, i, j) 将输出:1234, +1234, 001234, 1234, 1234567注意:对于long型数据输出,必须在格式符之前有长度修饰符 1,表明输出long型数据。 若 int k=045; long p=-lL; printf (%4o, %61o”,k, k,P) 将输出:045, 45, 37777777777 而 printf ( "%#x, %4x, %61x” , k, k, p)将输出:0x25, 25, FFFFFFFF 若 unsigned int u= 65535u;prinif( "%d, %4u, %ln u, u, P)将输出:T, 65535, 4294967295 若 char chl= 045, ch2= 'a' ;printf ( a%c, %-3c, , ” , chi, ch2, ch2) 将输出:%, a, a若 char s[]="ABCDEF ';printf (” %3s, %4.2s, %-7. 4s, %. 5s ",s, s, s, s)将输出:ABCDEF, AB, ABCD, ABCDE 若 float f=123. 4567f; double d=123. 456789;printf( “%。4f, %8. 3f, %-7. 2f, %o 7f” , f, f, f, d) 将输出:123. 4567, 123. 457, 123. 46, 123. 4567890 而 printf ( u%o 6e, _x0010_. 2e, %-10. 2e, %. 2e, %. 9e" , f, f, f, f, d)将输出:1. 23457e+02 ,1. 2e+02 , 1. 2e+02 , 1. 2e+02 , 1.23456789e+02 注意:实型数据的有效位数,不要以为凡是打印(显示)的数字都 是准确的。一般地,float型只有7位有效数字,double型有15位 有效数字。实际上,因计算过程中的误差积累,通常不能达到所说的 有效位数。] 另外,要注意%g格式的特殊性,当它选择“整数部分。小数部 分"形式时,因格式修饰说明。p在e格式中的意义是指明精度,所 以p的值是整数部分位数与小数部分位数之和(不是f格式中的小数 位数)。如有float gl=12. 34f, g2=0. Of; double d=123. 456789, g=123456. 789;printf ( "%g, %G” , gl, g2); char * lines[ ]= ( "ADA” , “ALGOL”,“C” , “C++”, “FORTRAN” , “PASCAL” ); 则lines指针数组的每个元素分别指向以上字符串常量的首字 符。在这里数组名lines可以作为它的首元素lines[0]的指针, lines+k是元素lines[k]的指针,由于lines[k]本身也是指针,所 以表达式lines+k的值是一种指针的指针。如有必要还可引入指针 变量cp,让它指向数组lines的某元素,如cp=&lines[k].这样,cp 就是指向指针型数据的指针变量。在这里,cp是指向字符指针的指 针变量,它应被定义成:char * *cp; 为了定义这样的cp,它的前面有两个*号。由于*自右向左结合, 首先是“* cp”表示cp是指针变量,再有**cp表示cp能指向的是 某种指针类型,最后"char * *cp"表示指针变量cp能 指向字符指针数据对象。如果有赋值cp=& lines[1],让它指向 数组元素lines[l],则*。口引用lines[l],是一个指针,指向字符 串“ALGOL"的首字符。* *cp引用lines[l][0],其值是字符'A'. 下面的代码实现顺序输出指针数组lines各元素所指字符串: for(c=lines;cpPrintf( "%s\n” , *cp); 设有数组a口和指针数组pt□有以下代码所示的关系: int a[]= (2, 4, 6, 8, 10 );int *pt[] = {&a[3], &a[2], a[4], &a[0], &[1]}; int * *p; printf( a%f, %g, %g, %g, %.8g” ', gl, gl, d, g, g)将输出: 12. 34, 0 12.340000, 12. 34, 123. 457, 123457, 123456. 79 下面的代码利用指针数组pt []和指针的指针p,遍历数组a□: for( p=pt; pprintf(, * *p); 指向字符串的指针变目 通常所说的字符串指针就是指向字符率某字符的字符指针。因字 符率存储于字符数组中,所以字符串指针也就是指向数组元素的指 针。 为程序中引入的字符串常量提供存储空间有两种方法。一是把字 符率常量存放在一个字符数组中。例如,char s[]= "I am a string."; 数组s共有15个元素,其中s[14]为'\0'字符。对于这种情 况,编译程序根据字符串常量所需的字节数为字符数组分配存储,并 把字符串复写到数组中,即对数组初始化。另一种方法是由编译系统 将字符串常量与程序中出现的其它常量一起存放在常量存储区中。程 序为了能访问存于常量存储区中的字符串常量,可用一个字符指针指 向它的第一个字符。当字符串常量出现在表达式中时,系统将字符率 常量放入常量存储区,而把表达式转换成字符指针,指向该字符串常 量的第一个字符。因此,可在定义字符指针变量时给它初始化指向某 字符串常量,或用字符申常量给字符指针变量赋值,这两种方法都使 字符指针指向字符串常量的第一个字符。例如,char *cpl, *cp2= "I am a stringw ;/*定义字符指针变量, 并赋初值*/ cpl=“Another string" ;/*先定义字符指针变量,然后按需要 赋初值*/ 上述代码使字符指针变量cp2指向字符率常量“I am a string” 的第一个字符I,使cpl指向字符串常量“Another string”的第一 个字符A. 指向二维数组中的某个一维数组的指针变量 如有一个二维数组,且指针变量所指的是二维数组中的一整行, 则指针变量另有一些很有意义的性质。设有二维数组为 int a[3][4]=({1, 2, 3, 4}, (5, 6, 7, 8 ), ( 9, 10, 11, 12 }}; 这里,数组a有3行4列。按行来看数组a,数组a有三个元素, 分别为a[0], a[l], a[2].它们又分别是一个一维数组,各有4个元 素。例如,a[0]所代表的一维数组为a[0][0]、a[0][l] > a[0]p[2], a[0] [3]. 一维数组名表达式的值是数组首元素(下标为0)的地址,二维数 组名a表达式是a的首行a[0]的地址。一般地,a+i可以看作二维数 组a的第i+1行的首地址。 因二维数组a能用a[0].a[l]、a[2]分别表示它的各行,所以 a[0]能表示用a[0]标记的a的第一行的首元素a[0] [0]的地 址;a[l]能表示用a[l]标记的a的第二行的首元素的 地址。一般地,a[i]能表示用a[i]标记的a的第i+1行的首元素 a[i] [0]的地址。由于数组的开始地址与数组首元素的地址相同,这 样.a+i与a[i]应有相同的值,但它们的意义不同,a+i表示用a[i]标记的a的第i+1行的首地址,a[i]表示用a[i]标记的a的第i+1 行的首元素a[i] [0]的地址。另外,因a[i]可写成*(a+i),所以a+i 与*(a+i)也有不同意义,而值相等。a[i]或*(a+i)表示二维数组a 的元素a[i][0]的地址,即根据地址运算规则,a[i]+j即 代表数组a的元素a[i][j]的地址,即&a[i][j].因a[i]与*(a+i)等 价,所以*(a+i) +j也与&a[i] [j]等价。 由二维数组元素的地址有多种表示形式,数组元素 a[i] [j]也有以下三种等价表示形式:*(a[i]+j)、*(*(a+i)+j)、 (*(a+i)) [i].特别是对于a[0] [0],它的等价表示形式有*a[0]和**a. 数组元素a[i][j]的地址也有三种等价的表示形式:a[i]+j、*(a+i)+j、&a[i] [j]. 也可以定义指向二维数组中某行由若干个元素所组成的一维数组的指针变量。如代码int (*p) [4]; 定义指针变量P能指向一个由四个int型元素组成的数组。指针 变量P不同于前面介绍的指向整型变量的指针。在那里,指向整型变 量的指针变量指向整型数组的某个元素时,指针增减1运算,表示指 针指向数组的下一个或前一个元素。在这里,p是一个指向由四个整 型元素组成的数组,对p作增减1运算,就表示向前进或向后退四个 整型元素。用例子说明指向由若干个元素所组成的数组指针的用法, 如有变量定义int a⑶[4], (*p) [4];则赋值p=a+l,使p指向二维数组a的第二行,表达式p+1的值为指向二维数组a的第三行。同二维数组元素的地址计算规则相对 应,若 P=a+1,则*p+j 指向 a[l] [j];*(p+i) +j,或者 p[i]则指向 数组a的元素a[i+l][j],二维数组名和指向数组的指针与数组元素 位置之间的关系。 指针变安的定义、初始化和引用 指针变量用于存放某个变量的地址。定义指针变量的一般形式
展开阅读全文

开通  VIP会员、SVIP会员  优惠大
下载10份以上建议开通VIP会员
下载20份以上建议开通SVIP会员


开通VIP      成为共赢上传
相似文档                                   自信AI助手自信AI助手

当前位置:首页 > 考试专区 > 其他

移动网页_全站_页脚广告1

关于我们      便捷服务       自信AI       AI导航        抽奖活动

©2010-2025 宁波自信网络信息技术有限公司  版权所有

客服电话:4009-655-100  投诉/维权电话:18658249818

gongan.png浙公网安备33021202000488号   

icp.png浙ICP备2021020529号-1  |  浙B2-20240490  

关注我们 :微信公众号    抖音    微博    LOFTER 

客服