资源描述
第一章 知识体系:
一:什么是标识符
1.组成: 字母,数字,下划线。
2.由字母,或下划线开头。
3.区分大小写:page和Page是两个不同的标识符
4.长度:有编译系统确定的,
二:分类:
1.关键字:系统给好的,规定好的,
2.预定义标识符 :printf scanf define
3.用户自定义标识符:除上两种外其他合法的标识符都是用户标识符。
三:整型数据、实型数据和字符型数据。
常量 A)定义:程序运行中,不能被改变的量。
B)分类:1)整型常量 1 ,2 3...
2)实型常量 3.0, 15.3...
3)字符型常量 'a', 'b', '12'
4)字符串常量 "chenzhe", "zhangsan"
C)符号常量:看下面的一段程序:
#include <stdio.h>
#define PI 3.14159 /*定义符号名PI为3.14159 */
void main()
{ double r,s;
r=5.0;
s=PI*r*r;
printf("s=%lf\n",s); }
变量:A)定义:在程序中其值可以改变的量,
B)变量的实质:代表内存中的存储单元。
C)变量应先定义后使用。
D)特性:1.凡未被事先定义的,不能作为变量名。
2.每一变量被指定为一确定类型,在编译时就能为其分配相同的存储单元。
3.指定每一变量属于一类型,这就便于在编译时,根据此检查该变量所进行的运算是否合法。
四:AA整型常量
1.整型常量的表示方法:
十进制、八进制、十六进制
2.三种进制的表示方法:
1).十进制数:用一串连续的数字来表示,中间不准许有空格或其他字符。如12、 23、 54
2).A)八进制数:用数字"0"开头(注意:不是字母"o")如:011、027...
B)八进制只能用合法的八进制数字表示,数字“0--7”,但当输入非法数字时候,C程序不会提示,只是得不到正确的结果。
C)十六进制数:十六进制数用数字"0"和字母"x"开头,十六进制只能含有合法的十六进制数字,字母"a--f"数字"0-9" 如0x11
3.进制之间的转化(略)
4.整型常量分类:
短整型、基本整型、长整型、无符号型
BB整型变量:
1.分类:短整型、基本型、长整型、无符号型
2.整型变量的定义:
1)基本整型变量用类型名关键字 int 进行定义。
2)一个定义语句必须用分号“;”结束。在一个定义语句中可以同时定义多哥变量,变量之间用“,”隔开。
3)一般计算机为基本类型开辟4个字节的存储单元,基本整型准许存放的数值范围是:---
4)当程序中用以上方式定义变量时,i,j,k时,编译程序会为变量i,j,k都开辟存储单元,但并没有在存储单元中存放任何初值,因此这些存储单元中原有的信息垃圾并没有被清楚,这时,变量中的值是无意义的,称变量值“无意义”
5)C语言规定,可以在变量定义的同时给变量赋初值,也称为变量的初始化。
五:AA实型常量
1. 表示形式:1)小数形式
例如:12.3 、 0.214 、 12. 、 .23 、 …..
2)指数形式
注意:1)C语言语法规定,字母E或e之前后必须有数字,且e或E后面的指数必须为整数,字母或前后以及数字之间不得有空格
2.BB实型变量
1)C语言中实型变量分为:单精度和双精度两类,分别用类型名”float ”和“double”.
例如:单精度定义: float i,j;
易错题型分析
合法的关键字是()
A integer B sin C string D void
答案(D)
分析:本题考察了关键字,参考课本附录一
不合法的用户标识符()
A PRLNTF B Main C file D xyz.c
答案(D)
分析:C语言中使用了”.”是不对的。用户标识符只允许出现“数字、字母和下划线“
以下不能定义为用户标识符的是()
A scanf B Void C _3com_ D int
答案(D)
分析:int 是C语言的关键字,关键字不能作为用户标识符,void是C语言的关键字,但是Void 却不是。因为在C语言中区分大小写。
以下正确的整型常量是()
A 34.1 B -80 C 2,000 D 1 2 3
答案(B)
分析:选项A后边有小数点,C后边有逗号,D后边有空格 这些都是不对的
不正确的实型常量
A 7.374E-1 B 0.1254 E2 C -44.44 D 123e-2
答案(B)
分析:字母E的前后都不能有空格
下列叙述不正确的是()
A在C程序中,%是只能用于整型运算符的
B在C程序中,无论是整数还是实数都能无误的表示
C若a是实型变量。C程序中a=20是正确的,因此实型变量允许被整型数赋值的。
D在C程序中,语句之间必须用分号“;“分隔
答案(B)
分析:选项B只对了一半,整数可以无误的表示,而实数并不都是正确无误的
若变量已正确赋值,下面的表达式正确的是
A a=a+7; B a=7+b+c
C int (12.3/4) D a=a+7=c+d
答案(B)
分析:A选项后面不应该有分号,C选项(int)—类型名缺少括号,D选项C中规定在赋值号的左边应当是一个变量或是一个代表存储单元的表达式,但是在a+7=c+b中,赋值号的左边出现了一个算术表达式a+7;所以只有答案B是正确的。
结果正确的是()
mian()
{ int a=3;
printf(“%d,%d,%d,%d\n”,++a,--a,a++,a--);
}
A 3,2,2,3 B4,3,3,4 C3,3,3,2 D4,3,3,4
答案(A)
分析:a=3,执行printf语句,其求值是自右向左运算,先计算a--;a的值是3,再计算a++,a的值是2,依次向后。。。。。。
++i,- -i(在使用前,先使i的值加减1,在使用此表达式的值参加运算)
i++,i--(在使用后,使i的值加减1,在使用此表达式的值参加运算)
第三章 顺序结构
知识体系:
一:基本概念:
1.按他们在程序中出现的顺序逐条执行,由这样的语句构成的程序结构,称为顺序结构。
2.把数据从计算机内部送到计算机外部设备上的操作叫做"输出";从计算机外部设备将数据送入计算机内部的操作叫做"输入";
3.C语言本身不提供用于输入和输出的语句。在C语言程序中,可以通过调用标准库函数提供的输入和输出函数来实现数据的输出和输入;
二:printf函数
A)1.printf函数是C语言提供的标准输出函数,它的作用是在终端设备上按指定的格式输出。
2.printf函数的一般调用形式:
printf(格式控制,输出项表)如果在printf函数之后加上";",就构成了输出语句。
例如:printf("a=%d,b=%d",a,b);
1. printf是函数名,
2. "a=%d,b=%d"是格式字符串
3. a,b是输出项表中的输出项。
B:格式控制的作用
1。它总是由“%”开始,进跟其后的是格式描述符。
2。为各输出提供格式转换说明
3。提供需工原样输出的文字或字符。
a:在格式控制内,除格式说明外的其它字符,一律原样输出 . 例:printf("a=%d",a); "a="原样输出。
b: printf("%%%");
三:printf函数中常用的格式说明
1。格式字符:(见表3。1)
2。修饰符(位于%和格式字符之间)
A: l 长 d ld f lf
h 短 hd
+ 使输出的数字总是有“+”或“-”
- 左对齐
0 前导0
# 在输出的八进制或十六进制前加前导“0”或“0x”,在其他进制前无效。
B)输出数据所占宽度;(m。n)
(1)对整数指定宽度:(d)
m:当变量的实际宽度小于m时,在边多佘位置补空格;当变量的实际宽度大于m时,按实际输出。
n:当变量的实际宽度大于n时,按实际输出;当变量的实际宽度小于n时,左边多余位置补0;
(2)对实数指定宽度:(m.n)
m:用于指定实数的总体宽度。包括小数点
当实数的总体宽度小于m时,在数据左侧补空格;当实数的总体宽度大于m时候,m无效。
n:用于指定实数的小数部分的宽度;
当实数的小数部分小于n时,在数据右侧补0;当实数的小数部分大于n时候,将小数的多余部分四舍五入。
第二部分:输入函数:
1.定义:
2.scanf函数的一般调用形式:
1.scanf(格式控制,输出项表)如果在scanf函数后加上";"就构成了输入语句:
例如: scanf("%d%d",&a,&b);求地址运算符
scanf函数名;
“%d%d”格式控制
&a,&b是输入项表中的两个输入项;
三:格式说明:
A格式控制串的作用是指定输入时的数据转换格式;既格式转换说明
B格式转化说明符是由"%"开始,其后是格式描述符
C输入项表中的各输入项用逗号隔开,各输入项只能是合法的地址表达式。
四:scanf函数 中常用的格式字符
c 字符
d 十进制整数
i 输入整形数,可以是带前导0的八进制数,也可以是带前导0x的十六禁止数;
o 以八进制形式输入整形数,可以带前导0,也可以不带前导0
x 以十六禁止形式输入整形数,可以带前导0x也可以不带前导。
u 无符号十进制数
f(lf) 输入单晶度(双精度)数
s 输入字符串
易错题型分析
下列选项中不是C语言语句的是
A :{ int i;i++;printf(“%d”,i);} B:;
C: a=5,c=10 D { ; }
[答案] C
[分析]:A中用一对花括号把若干语句括起来,按语法规定这是一个复合语句。
B中只有一个;这是一个空语句。D 是一个复合语句,C是一个逗号表达式,最后没有分号。因此不是语句。
若有以下程序字段
int m=0xabc,n=0xabc;
m-=n;
printf(“%X\n”,m);
A 0X0 B 0x0 C 0 D 0XABC
[答案] C
[分析]:格式字符x或X是以十六进制无符号形式输出整型数(不带前导0x或0X),对于x用abc输出,X用ABC输出。
若有说明:double a;则正确的输入语句为
A scanf(“%lf”,a); B scanf(“%f”,&a);
C scanf(“%lf”,&a) D scanf(“%le”,&a);
[答案] D
[分析]:A变量不变量的地址。B因为double格式为%lf或%le C语句末没有加分号
有以下程序段:
int m=0,n=0;char c=’c’;
scanf(“%d%c%d”,&m,&c,&n);
printf(“%d,%c,%d\n”,m,c,n);
若从键盘上输入10A10(回车),则输出结果是
A10,A,10 B 10,a,10 C 10,a,0 D10,A,0
[答案] D
[分析]:在scanf语句 ,键盘输入时,使用的间隔符应与输入项之间的间隔符一致
[历年考试回顾]
[07/04] :设变量均已正确定义,若要通过scanf(“%d%c%d%c”,&a1,&c1,&a2,&c2);语句为变量a1和a2赋数值10和20,为变量c1和c2赋字符X和Y。以下所示的输入形式中正确的是(注:□代表空格字符)(D)
A)10□X□20□Y〈回车〉 B)10□X20□Y〈回车〉
C)10□X〈回车〉 D)10X〈回车〉
20□Y〈回车〉 20Y〈回车〉
易错题型分析
下面错误的语句是()
A) if(a>b) printf(“%d”,a); B)if(&&) ; a=m;
C)if(1) a=m;else a=n; D)if(a>0) ;else { a=n;}
[答案] B
[分析] 本题考察了if语句和关系运算的知识,&&不能作为表达式。
以下程序的输出结果是()
#include “stdio.h”
main()
{ int a,b,c;
a=10;b=50;c=30;
if(a>b) a=b,b=c;c=a;
printf(“a=%d,b=%d,c=%d”,a,b,c);}
A a=10,b=50,c=10 B a=10,b=30,c=10
C a=50,b=30,c=10 D a=50,b=30,c=50
[答案] A
[分析]本题考察了if语句的执行流程。首先要注意到“a=b,b=c;”是一条语句,因为a>b的值是假,if语句什么都不能做。在就是要注意到语句“c=a”与if语句无关
有以下程序
main()
{ int i=1,j=1,k=2;
if(j++||k++)&&i++) printf(“%d,%d,%d\n”,i,j,k);
} 执行后输出的结果是()[多多注意短路现象]
A )1,1,2 B )2,2,1 C) 2,2,2 D) 2,2,3
[答案] C
[分析]在c语言中,执行“||”运算的两个操作数,若有一个值为1,则整个表达式的值都为1,若运算符左边的值为1,则就不能继续执行右边的操作数了。
以下程序运行后的结果是_____
main( )
{ int x=10,y=20,t=0;
if(x==y) t=x;x=y;y=t;
printf(“%d,%d\n”,a,b);
} [答案] 20,0
[分析],本题的if语句提只有一个语句,所以本题没有交换x,y 数值的功能。
以下程序运行后的结果是_____
main( )
{ int a=1,b=3,c=5;
if(c=a+b) printf(“yes\n”);
else printf(“no\n”);
} [答案] yes
[分析] 在条件中表达式的值是”c=a+b”的值,a+b的值4赋给c则条件表达式的值是4,条件成立。
[历年考试回顾]
[07/04]设变量x和y均已正确定义并赋值,以下if语句中,在编译时将产生错误信息的是(C)
A)if(x++); B)if(x>y&&y!=0);
C)if(x>y) x- - D)if(y<0) {;}
else y++; else x++;
[07/04] 以下选项中,当x为大于1的奇数时,值为0的表达式(D)
A)x%2==1 B)x/2 C)x%2!=0 D)x%2==0
[07/04]以下叙述中正确的是(C)
A)break语句只能用于switch语句体中
B)continue语句的作用是:使程序的执行流程跳出包含它的所有循环
C)break 语句只能用在循环体内和switch语句体内
D)在循环体内使用break语句和continue语句的作用相同
[07/04]有以下程序(A)
main()
{int k=5,n=0;
do
{switch(k)
{case1: case3:n+=1; break;
default;n=0;k--;
case2: case4:n+=2;k--;break;
}
printf(“%d”,n);
}while(k>0&&n<5);
}程序运行后的输出结果是
A)235 B)0235 C)02356 D)2356
第六章字符类型数据
知识要点:
一:字符常量
1.C语言中,一个字符常量代表ASCII字符集中的一个字符,在程序中有单引号把一个字符括起来作为字符常量.
'A' 65 'a' 97 'b' 'c'
2.说明:1)单引号中,大小写字母代表不同的字符常量.
2)' '也是一个字符常量,但不能写成两个连续的单引号.
3)字符常量只能 包含一个字符.
4)字符常量在内存中占一个字节,作为整型量来处理.
对应的整型数值就是ASCII字符集中该符号的序号.
字符表(ASCII表附录3)
二:转义字符常量:
1)转义字符常量只代表一个字符.
2)反斜线后的八进制数可不用0开头,十六进制可由小写x开头,但不准许大写字母X或0x开头. 3)转义字符表
字符形式 功能 字符形式 功能
\n 回车换行 \\ 反斜杠字符\
\t 横向跳若干格(Tab) \’ 单引号字符
\v 竖向跳格 \” 双引号字符
\r 回车符(本行开头) \ddd 三位八进制代表的一个 ASCII字符
\f 换页符 \xhh 二位十六进制代表的一个 ASCII字符
\b 退格符(Backspace) \0 空值,其ASCII码位0
三:字符串常量
1.字符串常量是由双引号括起来的一串字符.
2.在C语言中,系统在每个字符串的最后自动加入一个字符'\0'作为字符串的结束标志,'\0'占一个字节,在写字符串时不必加,系统会自动添加.
四:各类数值型数据之间混合运算.
1."= ="代表等价的意思.
2.运算作用:
1)大小写字母转换:
'A'+32==65+32==97='a'
2)数字字符和整数之间的相互转换
'9'-'0'==57-48==9
'0'+9==48+9=57='9'
3)关系运算和逻辑运算
'a'<'b' 'a'&&'b'
五:字符变量:
1.字符变量用关键字char定义,在定义同时赋初值.
例如:char ch1='A',ch2='B';
2字符变量在内存中占一个字节,其中只能存放一个字符,把字符放入该变量后,字符变量的值就是该字符的ASCII代码值.
第二节:输入输出函数
一:调用printf哈scanf函数输入和输出字符.
1.printf函数:
1)c格式字符,用来输入一个字符(包括转义字符)
例如:char ch='c';printf("%c",ch);
2)一个整数,只要它的值在0--255范围内,也可以用字符形式输入;反之,一个字符类型数据也可以用整数形式输出.
例如:main()
{char ch='a';int i=97;
printf("%c,%d\n",ch,ch);printf("%c,%d\n",ch,ch);}
3)可以进行大小写字母转换.
例如:main()
{char ch1,ch2;
ch1='a'; ch2='b';
ch1=ch1-32;ch2=ch2-32;
printf("%c,%c",ch1,ch2);
}
2.scanf函数
1)当用%c格式输入字符,无须间隔符,在这里,回车、空格、tab、 转义字符都是有效字符(以下例外)
scanf("%c %c %c",ch1,ch2,ch3);
此时,空格、tab、回车、都作为间隔符不能被读入。
二:调用putchar和getchar函数输出和输入字符。
1.使用putchar和getchar函数输出和输入字符时候,必须要用头文件。
2.putchar函数的作用是向终端输出一个字符:putchar(ch);
例如:
main()
{char a,b,c;
a='B';b='0';c='Y';
putchar(a);putchar(b);putchar(c);
}
3.gechar函数的作用是从终端输入一个字符,形式为:
ch=getchar();按回车字符才可以送入:
例如
#include "stdio.h"
main()
{char ch;ch=getchar();putchar(ch);}
第三节:程序举例
1.输出26个大写字母和他们的ASCII代码。每行输出两组数据。
2.从终端输入一行所有的小写字母转换为大写字母,其他字符不变;
3.编写程序统计输入的字符中,空格,回车符,和横向跳格(Tab)符的个数。
二:练习部分《考点分析》
1. 关于字符常量下面说法正确的是_______
A单引号中的大小写代表着相同的字符常量。
B空格不是一个字符常量
C字符常量能包含大于一个的字符
D所有字符常量都作为整型量来处理。
2. 关于字符串常量,下面叙述正确的是_______
A字符串常量是用双引号括起来的一串字符,字符数量一定大于1
B在printf和scanf函数中的”%d%d”也是字符串常量。
C对于”lzhm”这个字符串,其在内存中所占字节数为4
D空串不占内存。
3. 关于字符量的运算,以下说法错误的是_______
A在C语言中,字符量和整数的内存形式是一样的
B在C语言中,字符量可以参与关系运算,
C对于表达式‘a’<98,因为类型不同,从而无法比较。
D在C语言中,字符量可以参与逻辑运算。
4. 关于字符变量,下面表达是正确的是________
A字符变量和字符串变量都是用关键字char说明
B将一个字符赋给一个字符变量时候,是将该字符对应的ASCII码存储到内存单元中,
C字符数据只能用于字符运算。
D一个字符能用整数的形式输出,但一个整数不能用字符的形式输出。
5. 若int 类型数据占两个字节,则下列语句的输出结果为_______
int k= -1; printf(“%d,%u\n”,k,k);
A-1,-1 B-1,32767 C -1,32768 D-1, 65535
6.下面的输出结果是____
A 0 B 变量无定义C -1 D 1
第七章 函数
知识要点:
第七章函数
第一节函数的定义和返回值
一:库函数;
1.一个C语言源程序无论包含多少函数,C程序总是从main函数开始执行.
2.调用C语言标准库函数的要求的include命令;
1)用户在源程序include命令中应该包含头文件.
#include <stdio.h>
include命令必须用#开头,系统提供的头文件以.h作为文件的后缀,文件用" "或 < >括起来. 2)include 命令不是C语句,因此不能在最后加分号.
3.标准库函数的调用:
1)一般调用形式为:函数名(参数表)
scanf("%d",&a);printf("%d",a);
putchar(ch); ch=getchar();
2)库函数的调用形式可以两种形式出现:
A) 出现在表达式中: y=pow(x,2)=5;
B)作为独立的语句完成某种操作:printf("*******\n");
*数学函数:调用数学函数时,要求在源文件中包含#include <math.h> 参考附录表:
**字符函数和字符串函数:调用字符函数时候,要求在源文件中包含头文件"ctype.h"; 调用字符串时候,要求在源文件中包含头文件"string.h"
***输入输出函数:在调用输入输出函数时,要求在头文件中包含"stdio.h"
二:自定义函数的定义:
1)C语言函数定义的一般形式为:
函数返回值的类型名 函数名(类型名 形式参数1,类型名 形式参数2,....)
/*函数首部*/
{ 说明部分
/*函数体*/
语句部分
} 如:int abs(int x)
2).旧版本:略
3).函数名和形式参数都是由用户命名的标识符,在同一程序中,函数名必须唯一;形式参数名只要同一函数中唯一即可.可以与其他函数中的变量同名.
4)C语言规定,不能在一个函数的内部在定义函数.
5)若在函数的首部省略了函数返回值的类型名,返回函数的首部写成: 函数名(类型名 形式参数1,类型名 形式参数2....)
C语言默认返回值类型为int 类型.
例如:编写求两个双精度数之和的函数.
double add (double a,double b)
{double s; s=a+b; return s;}
6)函数体中,除形式参数外,用到的其他变量必须在说明部分进行定义,这些变量(包括形参),只在函数被调用时才临时开辟存储单元,当退出函数时候,这些临时开辟的存储单元全部被释放,因此,这种变量只在函数体内部起作用,与其他函数中的变量互不相关,他们可以和其他函数中的变量同名.全部被释放,因此,这种变量只在函数体内部起作用,与其他函数中的变量互不相关,他们可以和其他函数中的变量同名。 三:函数的返回值:
1)函数的值通过return语句返回.return 语句的形式如下:
return 表达式; 或 return (表达式); 或return ;
2)说明:
1.1 return 语句中的表达式的值就是所求的函数的值.此表达式的值的类型必须与函 数的首部所说明的类型一致,若类型不一致,则以函数值的类型为准,由系统自动进行转换。 1.2当程序执行到return语句时,程序的流程就返回到调用该函数的地方,并带回函数值,在同一函数内,可以根据需要在多处出现return 语句.例如:
int fun(int x)
{int i,s=0;for(i=1;i<=x;i++)s+=i; return s;}
main()
{int s;s=fun(100);printf("s=%d\n",s);}
第二节函数的调用和说明
一:函数的两种调用方式:
1.函数的一般调用形式为: 函数名(实在参数表)
实在参数(简称实参)的个数多于一个时,各实在参数之间用逗号隔开,若函数无形参,调用形式为:函数名( )函数后的一对括号不可少.
int fun(int x)
{int i,s=0;for(i=1;i<=x;i++)s+=i;return s;}
main()
{int s;s=fun(100);printf("s=%d\n",s);}
2.函数说明:
1)在C语言中,除了主函数外,对于用户定义的函数要遵循"先定义,后使用"的规则,凡是未在调用前定义的函数,C编译程序都默认函数的返回值为int类型,对于返回值为其他类型的函数,若把函数的定义放在调用之后,应该在调用之前对函数进行说明;
2)函数说明的一般形式如下:
类型名 函数名(参数类型1,参数类型2...)
例如:double add(double ,double)
或 类型名 函数名(参数类型1 参数名1,参数类型2 参数名2...)
例如:double add(double a,double b)
此处的参数名完全是虚设的,他们可以是任意的用户标识符.
3)函数说明可以是一条独立的语句,
如: double add(double ,double );
也可以与普通变量一起出现在同一个定义语句中.
如:double x,y, add(double ,double );
4)在函数名前没有说明函数返回值类型时,隐含int类型.
2.函数说明的位置
2.函数说明的位置
1) 当在所有函数的外部,被调用之前说明函数时,在函数说明的后面所有位置上都可以对该函数进行调用.
2)函数说明也可以放在调用函数的说明部分,如在main函数内部进行说明,则只能在main函数内部才能识别该函数。
第三节调用函数和被调用函数之间的数据的传递
一:C语言中,调用函数和被调用函数之间的数据的传递可以通过三种方式进行传递:
1.实在参数和形参之间进行数据传递。
2.通过return语句把函数值返回调用函数。
3.通过全局变量
二在C语言中,数据只能从实参单向按值传递,也既是说,当简单变量作为实参时,用户不可能在函数中改变对应实参的值。例如:以下程序例示了函数之间的单向传递,请观察程序的执行结果。
main()
{int x=2,y=3,z=0;
printf("(1)x=%d,y=%d,z=%d\n",x,y,z);
fun(x,y,z);
printf("(4)x=%d,y=%d,z=%d\n",x,y,z);} fun(int x,int y,int z)
{printf("(2)x=%d,y=%d,z=%d\n",x,y,z);
z=x+y;x=x*x;y=y*y;
printf("(3)x=%d,y=%d,z=%d\n",x,y,z);}
第四节程序举例(略)
1. 在C语言中,函数返回值的类型最终取决于(A)
A)函数定义时在函数首部所说明的函数类型
B)return语句中表达式值的类型
C)调用函数时主函数所传递的实参类型
D)函数定义时形参的类型
2. 有以下函数
int fun(char *s)
{char *t=s;
while(*t++);
return(t-s); }
该函数的功能是(B)
A)比较两个字符的大小 B)计算s所指字符串占用内存字节的个数
C)计算s所指字符串的长度 D)将s所指字符串复制到字符串t中
3. 若函数调用时的实参为变量时,以下关于函数形参和实参的叙述中正确的是
A)函数的实参和其对应的形参共占同一存储单元
B)形参只是形式上的存在,不占用具体存储单元
C)同名的实参和形参占同一存储单元
D)函数的形参和实参分别占用不同的存储单元
4. 以下程序中函数f的功能是在数组x的n个数(假定n个数互不相同)中找出最大最小数,将其中最小的数与第一个数对换,把最大的数与最后一个数对换.请填空.
#include <stdio.h>
viod f(int x[],int n)
{ int p0,p1,i,j,t,m;
i=j=x[0]; p0=p1=0;
for(m=0;m<n;m++)
{ if(x[m]>i) {i=x[m]; p0=m;}
else if(x[m]<j) {j=x[m]; p1=m;}
}
t=x[p0]; x[p0]=x[n-1]; x[n-1]=t;
t=x[p1];x[p1]= ________; ________=t;
}
main()
{ int a[10],u;
for(u=0;u<10;u++) scanf("%d",&a[u]);
f(a,10);
for(u=0;u<10;u++) printf("%d",a[u]);
printf("\n");
}
第二节:指针的定义赋值。
一:指针变量的定义和指针变量的基本类型
1. 定义指针变量的一般形式:
类型名 *指针变量名1,*指针变量名2,…...
说明:A类型名是指基本类型
B *是说明符
C指针变量名是用户标识符
例如:A int *p,*q; /*定义两个指针变量*/
这里说明,p,q是指向整型( int 型)的指针,p,q中只能存放整型变量的地址。
B 看下面的定义: int **p,*s,k=20;
s=&k; p=&s;
p为一个指向指针的指针变量.
*p代表存储单元s,*s代表存储单元k,因此**p也代表存储单元k.
二给指针变量赋值
1. 通过求地址运算(& )获得地址值,
1) 单目运算符&用来求出运算对象地址,得用求地址运算可以把一个变量的地址赋给指针变量。例如:p=&k;
2) 把变量k的地址赋予q,这时可以说:q指向了变量k
3) A求地址运算符、&只能用于变量和数组元素。不可以用于表达式和常量或被说明为register的变量。
B&必须放在运算对象左边,且运算对象类型必须和指针变量的类型相同。
4) 在调用scanf函数时,若q=&k,则scanf(“%d”,&k)和scanf(“%d”,q)是等价的,
2. 通过指针变量获得地址值。
1) 可以通过赋值运算,把一个指针变量中的地址赋给另一个指针变量,从而使这两个指针变量指向同一地址,例如:p=q;
2) 当进行赋值运算时,赋值号两边的指针变量的类型必须相同。
3) 通过标准函数获得地址值。
可以通过调用库函数malloc和calloc在内存中开辟动态存储单元;并把所开辟的动态存储单元的地址赋给指针变量(不做要求)
4.给指针变量赋“空”值
1)除了给指针变量赋地址值外,还可以给指针变量赋NULL值。如:p=NULL,等价于p=’\0’;或p=0;
2)在使用NULL时,应该在程序的前面出现预定义:
#include “stdio.h” NULL的值为0,当执行以上赋值语句后,称p为空指针。
第三节 对指针变量的操作
1. 通过指针来引用一个存储单元
间接访问运算符(间址运算符) “*”单目运算符。
1) int *p,i=10,j;
p=&i;*p=i;
则:j
展开阅读全文