计算机二级C语言程序设计考点:指针(15篇)
1.计算机二级C语言程序设计考点:指针 篇一
C语言是一种结构化的程序设计语言
结构化程序设计的优点是便于分工合作,便于调试、维护和扩充。这种程序设计方法是将一个大程序分成若千个模块,每个模块完成一个功能,由一个总控模块来控制和协调各个模块来实现总的功能;因此,这种程序设计方法又称为模块化程序设计方法。在C语言中,函数是构成C谙言程序的最小模块。实际上,C语言的程序是由一个或者多个文件组成的,每个文件叉是由一个或多个函数组成的。因此,一个程序是由一个或多个函数组成的,其中,须有且仅有一个主函数,生函数的名字规定为rnaino这样,组成一个程序的者干个文件中,仅有一个是主文件,只有主艾件中才含有main()函数。另外,函数是由若干条语句组成的,语句是由若干个单词组成的‘单词是由若干个字符组成的。字符是构成程序的最小单元。e语言程序的构成如下所示:
程序~文件~函数~语句~单词、字符。
C语言是结构化程序设计语言,它具有构成三种基本结构模式的语句,这种结构化程序设计应具有的三种基本结构模式如下:
顺序结构棋式
它将由若干条顺序执行的语句构成,这是程序设计的最基本形式。
分支结构模式
C语言中具有条件语句和开关语句,它将会构成各种需要的分支结构模式。
循环结构模式
C语言中提供了三种循环语句(for循环,whil。循环和do-while循环),用它们可以构成
各种循环结构模式
在讲述C语言是一种结构化程序设计语言的同时,还必须指出它与其他结构化程序设计语言(如PASCAL语言)相比较,还有一些不完全之处,因此,C语言是一种不完全的结构化程序设计语言。其表现如下:
第一,完全的结构化程序设计语言不允许使用goto语句,因为goto语句会破坏结构化。
但是。got。语句在某些时候会使得程序简练,因此,在C语言中原则上允许使用goto语句,为了减少它对结构化的影响,采取了限制使用的办法,即规定got。语句的转向范围只能在一个函数体内。不得使用gates语句从一个函数体内转向到另一个函数体中,这种限制性地使用goto语句会给编程带来一些方便,又不会影响棋块之间的结构化。但是,建议在G语言的程序中尽量少使用goto语句。
第二,完全的结构化程序设计语言要求一个模块只有一个入口和一个出口,这样便于结构化的管理。但是,C语言程序中允许函数使用多个返回语句(return语句),即允许函数有多个出口,返回到调用函数。这样做也是为了编程中的方便。在C语言程序中,可以使用条件语句来返回不同的函数值。
由此可见,C语言虽然是一个不够严格的结构化程序设计语言,但它是一个使用起来十分灵活的高级语言。
1.计算机二级C语言程序设计考点解析:C语言程序实例
2.计算机二级C语言程序设计考点:指针
3.计算机二级C语言程序设计考点:函数
4.计算机二级C语言程序设计考点:数组
5.计算机二级C语言考点:字符型数据
6.计算机二级c语言试题
7.计算机二级C语言程序设计考点解析:常用的输人函数
8.计算机二级C语言程序设计考点解析:常用的输出函数
9.计算机二级C语言程序设计考点:单词及词法规则
10.计算机二级《C语言》基础练习题及答案
2.计算机二级C语言程序设计考点:指针 篇二
1 指针的概念
计算机对信息的处理都由操作系统调入存储器存放并执行,存储器中有众多的存储单元,存储单元是用来存放数据的。存放在存储单元中的数据称为存储单元的内容(或值)。计算机为了对存储单元进行有效的管理,便为存储单元进行编号(以字节为单位),这个编号就是“地址”,这个“地址”又称为指针[1]。每个变量都有一个地址。不同数据类型的变量,占用的字节数不同,系统把变量占据存储单元的第一个字节的地址作为该变量的地址。有了地址我们就可以引入指针变量。指针变量是一种特殊的变量,变量中存放的不是某种数据类型的数据,而是存放另一个变量的地址。如果一个指针变量存放了另一个变量的地址,则形象地称指针变量指向那个变量。下面提供一个指针的例题,通过分析例题来理解指针的概念。
例:利用指针,求两个整数的和。
在程序当中,首先定义两个普通变量i,j,再定义两个指针变量p,q,为了进行区分普通变量和指针变量,所以在指针变量名前加’*’号。不能引用没有赋值的指针变量,否则可能会造成系统瘫痪,所以将&i赋值给p,&j赋值给q,说明指针变量指向了普通变量。如图所示:
有了指向关系,在输出语句中就可以利用指针来访问普通变量i,j。
2 指针的运算
指针变量和其他变量一样,也可以进行运算,由于指针的运算实际上是地址的运算,所以和其它变量的运算又有区别[1]。
1)间接访问运算
用变量名对其所对应的存储单元的内容进行读写称为直接访问,而通过存储单元的地址对其内容进行读写的则称为间接访问。尽管指针变量中保存的是存储单元的地址,而引入指针的目的主要是为了更方便快捷地访问存储单元的内容。
间接访问是在引用的指针变量前面加一个“*”号,用来表示指针所指向的存储单元的值或内容。例如:
当指针p指向a后,若用指针p访问所指存储单元的内容时,可以写成*p,也就是说在这里*p与a是等价的。由于“&”与“*”两个运算符优先级别相同,且结合方向均为自右至左,又是一对互逆运算,所以有*&a=*p,&*p=&a。
2)指针变量加或减一个整型量,从而得到另一个地址,当然自增自减运算也是合法的。如先使p指向数组a的首地址(即p=a),则p+n表示的是下标为n的元素地址。p++表示:使p指向下一个元素a[1]。如果接着执行*p,则取出a[1]的值。*p++等价于*(p++)作用是:先得到p指向的变量的值(即*p),然后再将p+1=>p;*(p++)与*(++p)的作用不同,前者是先取*p的值,然后使p加1,而后者是先使p加1,再取*p;++(*p)表示p所指向的元素的值加1。指针变量乘除一个整型量无意义,C语言也不允许此类语句出现。
3)由于指针变量中的地址也是一数值,所以指针变量间也可以进行关系运算。
4)两个类型相同的指针变量可以相减,例如指向同一数组的指针变量相减可以得到两个指针间元素的个数。相加或相乘则无意义[1]。
3 指针的使用[3]
链表是数据结构的一种存储形式,能够实现动态分配存储空间。我们知道,用数组存放数据时,必须事先对数组定义固定的长度(即元素的个数)。例如,有的班级有100人,而有的班级有50人,如果要用同一数组先后存放不同班级的学生数据,则必须定义长度为100的数组。如果事先难以确定元素的个数,则必须把数组定义得足够大,以便够用;但实际若使用得很少,那样就造成了内存空间的浪费。定义小了又满足不了需求,为了解决这一矛盾,C语言提供了“需之则有,不需则无”的动态数据结构--链表,它根据需要开辟存储单元。
指针和结构体配合可以实现动态存储分配,用来实现对链表的建立、插入和删除等操作。
建立一个简单链表,结点类型定义的一般形式:
建立一个简单链表很容易,只需将引用自身的结构体变量的地址赋给前驱的next即可。在后面需增加结点(即一个此类型的结构体变量)时,只要将原链尾结构体变量中的引用自身的指针指向新增加的结点即可。
4 灵活应用指针还必须注意如下问题[2]
1)要注意指针变量的当前值。我们在做指针变量指向数组的练习时,经常会有这样的情况发生:
当我们运行程序时,输出的6个数据和我们输入的不一致,就是由于指针变量进行了移动,已经移出了我们的数据区域,当再利用指针进行访问元素时必须把指针变量的当前值重新指向数组中的第一个元素a[0]才可以。所以上面的程序在第二个for循环的前面加一条p=a或p=&a[0];程序的结果才是正确的。
2)在一维数组a[10]中,有语句p=a,则p+i和a+i都表示地址相当于&a[i],p和a都是指针,但是它们有区别,p是变量,可以实现p++,a是常量,a的值不能改变。
3)当指针指向字符串时,字符指针变量和字符数组之间是有区别的。
A、字符数组由若干个元素组成,每个元素中存放一个字符,而字符指针变量中存放的是地址。
B、定义了字符数组之后,只能对各个数组元素赋值,不能用下面方法对字符数组赋值:char str[];str=“I have a book!”;
而对指针变量,可以采用下面方法赋值:
5 结束语
指针是C语言的难点,但也是精髓,只要我们掌握了其本质含义,也就不难了。上面所介绍的是C指针使用过程中的一些常用、重要的方法和规则。要达到熟练灵活应用,还需要在实践中不断积累、总结、提高。
参考文献
[1]郝长胜.C语言程序设计[M].内蒙古:内蒙古大学出版社,2007.
[2]邓满英.浅析C语言指针[J].襄樊职业技术学院学报,2010(1).
3.计算机二级C语言程序设计考点:指针 篇三
Java 语言保留的,Java 的开发和运行平台认识,并能正确处理的一些单词。
其实就是个约定,就好比我们约定好,我画个勾勾表示去吃饭。那好了,只要我画个勾勾,大家就知道是什么意思,并能够正确执行了。
关键字这个约定在 Java 语言和 Java 的开发和运行平台之间,我们只要按照这个约定使用了某个关键字,Java 的开发和运行平台就能够认识它,并正确地处理。
2:Java 中有哪些关键字
abstract do implements private throw
boolean double import protected throws
break else instanceof public transient
byte extends int return true
case false interface short try
catch final long static void
char finally native super volatile
class float new switch while
continue for null synchronized enum
default if package this assert
3:Java 中关键字的基本含义
abstract:表明类或类中的方法是抽象的;
boolean:基本数据类型之一,布尔类型;
break:提前跳出一个块;
byte:基本数据类型之一,字节类型;
case:在 switch 语句中,表明其中的一个分支;
catch:用于处理例外情况,用来捕捉异常;
char:基本数据类型之一,字符类型;
class:类;
continue:回到一个块的开始处;
default:用在 switch 语句中,表明一个默认的分支;
do:用在“do while”循环结构中;
double:基本数据类型之一,双精度浮点数类型;
else:在条件语句中,表明当条件不成立时的分支;
extends:用来表明一个类是另一个类的子类;
final:用来表明一个类不能派生出子类,或类中的方法不能被覆盖,或声明一个变量是常量;
finally:用于处理异常情况,用来声明一个肯定会被执行到的块;
float:基本数据类型之一,单精度浮点数类型;
for:一种循环结构的引导词;
if:条件语句的引导词;
implements:表明一个类实现了给定的接口;
import:表明要访问指定的类或包;
instanceof:用来测试一个对象是否是一个指定类的实例;
int:基本数据类型之一,整数类型;
interface:接口;
long:基本数据类型之一,长整数类型;
native:用来声明一个方法是由与机器相关的语言(如 C/C++/FORTRAN 语言)实现的;
new:用来申请新对象;
package:包;
private:一种访问方式:私有模式;
protected:一种访问方式:保护模式;
public:一种访问方式:公共模式;
return:从方法中返回值;
short:基本数据类型之一,短整数类型;
static:表明域或方法是静态的,即该域或方法是属于类的;
strictfp:用来声明 FP-strict(双精度或单精度浮点数)表达式,参见 IEEE 754 算术规范;
super:当前对象的父类对象的引用;
switch:分支结构的引导词;
synchronized:表明一段代码的执行需要同步;
this:当前对象的引用;
throw:抛出一个异常;
throws:声明方法中抛出的所有异常;
transient:声明不用序列化的域;
try:尝试一个可能抛出异常的程序块
void:表明方法不返回值;
volatile:表明两个或多个变量必须同步地发生变化;
while:用在循环结构中;
assert:声明断言;
enum:声明枚举类型;
4:解释几点
(1):这些关键字的具体含义和使用方法,会在后面用到的地方讲述
(2):Java 的关键字也是随新的版本发布在不断变动中的,不是一成不变的
(3):所有关键字都是小写的
(4):goto 和 const 不是 Java 编程语言中使用的关键字,但是是 Java 的保留字,也就是说 Java 保留了它们,但是没有使用它们。true 和 false 不是关键字,而是 boolean 类型直接量
(5):表示类的关键字是 class
1.20计算机二级考试Java语言程序设计考试大纲
2.计算机二级C语言程序设计考点:指针
3.计算机二级C语言程序设计考点:函数
4.计算机二级C语言程序设计考点:数组
5.计算机二级C语言程序设计考点解析:运算
6.2016年全国计算机二级java语言程序设计考试大纲
7.2016年计算机二级考试试题(Java)
8.2016计算机二级考试Java练习题及答案
9.计算机二级考试考点PowerPoint篇
4.计算机二级C语言程序设计考点:指针 篇四
实验七 指针 了解指针的概念,学会定义和使用指针变量。2 掌握指针、变量和数组的关系及使用方法。3 学会使用指向函数的指针变量。
二 实验内容 编写函数fun(float *sn,int n),其功能是:根据以下公式计算s,计算结果通过形参sn传回;n通过实参传入,n的值大于等于0。上机运行并记录输入输出(主函数已给出)。
s11111 3572n1fun(float *sn,int n){ 定义变量:和s,通项w,符号f,循环控制变量i; /* 其中s、f要初始化 */ 循环求累加和s { 改变符号;/* 由负变正或由正变负 */ 求通项w;累加:s+=w;} 形参指针变量sn赋值;/* 通过形参sn传回累加和s */ } main(){ float s;int n;printf(“n=”);scanf(“%d”,&n);fun(&s,n);printf(“s=%fn”,s);}
完整程序如下:
#include
输出结果如下图: 想使指针变量pt1指向a和b中的大者,pt2指向小者,以下程序能否实现此目的? swap(int *p1,int *p2){ int *p;p=p1;p1=p2;p2=p } main(){ int a,b;int *pt1,*pt2;scanf(“%d,%d”,&a,&b);pt1=&a;pt2=&b;if(a
上机调试此程序。如果不能实现题目要求,指出原因并修改之。
子函数swap改成下面程序方可实现目的,主函数不变: swap(int *p1,int *p2){ int p;p=*p1;*p1=*p2;*p2=p;} 下面的程序用来实现将一个3×3的矩阵转置。#include 程序修改如下: #include 应改为: printf(“%cn”,*pt++); 1、请编写函数fun,其功能使:将两个两位正整数a b合并形成一个整数放在c中。合并的.方式使:将a数的十位和个位数依次放在c数的百位和个位上,b数的十位和个位数依次放在c数的千位和十位上。 答案: void fun(int a,int b,long *c) {*c=(b/10)*1000+(a/10)*100+(b%10)*10+a%10;} 2、请编写一个函数fun,它的功能使:计算n门课程的平均分,计算结果作为函数值返回。 答案: float fun(float *a,int n) {float ave=0.0; int i; for(i=0;i ave+=a; ave/=n; return ave;} 3、假定输入的字符串中只包含字母和*号。请编写函数fun,它的功能使:将字符串尾部的*号全部删除,前面和中间的*号不删除。 答案: void fun(char *a) {int i=0; char *p,*q; p=q=a; while(*p) p++; p--; while(*p==‘*’) p--; while(q<=p) {a=*q; i++; q++;} a=‘’;} 4、n名学生的成绩已在主函数中放入一个带头节点的链表结构中,h指向链表的头节点。请编写函数fun,它的功能是:求出平均分,由函数值返回。 答案: double fun(strec *h) {double aver=0.0; while(h!=null) {aver+=h->s; hy=h->next;} aver/=n; return aver;} 5、请编写函数fun,计算并输出给定10个数的方差。 答案: double fun(double x[10]) {int i,j; double s=0.0,s1=0.0; for(i=0;i<10;i++) s1+=x; s1/=10; for(j=0;j<10;j++) s+=(x[j]-s1)*(x[j]-s1); s/=10; s=pow(s,0.5); 1.1 指针 C语言中, 任何数据都会占用内存单元的。计算机内存的每个存储位置都对应唯一的存储地址, 而变量名作为变量数据存储区域所取的名字, 代表的是一个内存编号, 而这个内存编号对于用户来说是未知的。如定义:int a=12。 变量名a代表某个内存单元, 而变量值12则是这块内存单元里面的内容。在整个程序运行过程中, 通过变量名来访问变量, 变量名a所代表的这块内存单元不变, 所改变的只是这块内存单元里面的值。 C语言也支持使用变量存储地址来对变量进行存取操作, 要取得变量的存储地址, 可使用取地址运算符&, 如&a表示变量a的存储地址;而变量的存储地址就是指针。 1.2 指针变量 指针类型就是C语言中用于表示存储地址的数据类型, 而专门用来存放变量存储地址的变量则称为指针变量。 格式:数据类型 *指针变量名。跟普通变量不同的是, 所有指针变量占用的内存单元大小是一样的, 前面的数据类型代表的是指针变量所指向变量的数据类型。如以下代码: 1.3 二级指针变量 在C语言中, 任何值都有所对应的内存地址, 上述介绍的指针变量是指向普通变量的, 也就是普通的指针, 称为一级指针变量。 还有一种指针变量所指向的变量不是普通变量反而还是一个指针变量, 这种变量称为二级指针变量。如: int a=12;//普通变量a int *b=&a;//一级指针变量b, 指向普通变量a int *c=&b;//二级指针变量c, 指向指针变量b 而这时, *c只是代表取c所指向的变量b里面的值:&a, 而a的地址又是未知的。所以, 对于二级指针变量c, 要想取出a的值, 必须需要两个间接访问运算符**, 如**c=** (&b) =*b=* (&a) =a。 2 指针与数组的关系 2.1 指针与一维数组 数组元素在内存中是顺序存放的, 并且数组名代表的是这一块内存单元的首地址, 数组其他元素的地址可以根据每个元素所占用的内存单元依次推知。因此, 一维数组的数组名实际上就是该数组的指针。如以下定义: int a[10]={1, 2, 3, 4, 5};int *p=a; 此时, p指向数组中的第1个元素 (a[0]) , p+1指向第2个元素 (a[1]) , 依次类推。当然, p最开始也可以指向其他元素, 如指向第4个元素:p=&a[3]; 在指针的运算中, 经常会跟自增或自减运算符结合起来使用, 如以下代码: 上述代码就是指针与数组之间关系的一个典型示例, 通过自增或自减运算符不光改变p的指向, 也可以改变p所指向的内存单元里面的内容 (也就是数组元素的内容) 。 2.2 指针与二维数组 由于二维数组可以看成是多个一维数组, 如以下定义:int a[3][4];可以把二维数组a看成3个长度为4的一维数组a[0], a[1], a[2] (假定二维数组按行存储) ;a[0]为第一个一维数组的数组名, 里面有4个元素:a[0][0], a[0][1], a[0][2], a[0][3];a[1]和a[2]依次类推。此时, 虽然二维数组名a和&a[0][0]表示的是同一个地址, 但是指向的却是完全不同的两种存储区域。a指向的是一维数组a[0]中4个元素的存储区域的首地址, &a[0][0]指向第一个元素a[0][0]的地址。此时的a相当于二级指针, a等价于&a[0], 而a[0]又等价于&a[0][0], 所以**a才等价于a[0][0], *a只是a[0], 而a[0]还是地址, 此值对于用户来说是未知的。如以下代码: 2.3 字符串指针 对于一维字符数组指针来说, 如前所述, 比较简单一些, 如以下代码: 但是对于二维字符数组指针, 相对来说复杂一些, 如以下代码: 3 指针作为函数参数 3.1 值传递与地址传递 在C语言中, 函数的参数传递有两种:值传递和地址传递。所谓值传递是指在函数调用时, 给形参分配内存单元, 把实参的值一一传递给对应的形参。但在函数执行中, 只是对形参变量进行处理, 形参值的改变对实参没有影响。而地址传递是指在函数调用时, 实参把数据的存储地址传递给形参, 使其指向同样的存储区域, 这样, 在函数执行中, 对形参的处理实际上就是对实参的处理, 形参值的改变对实参有影响。在C语言中, 地址传递一般通过指针或数组名来作为函数的参数。如以下代码: 在上述代码中, 函数swap1就是值传递, swap2就是地址传递, 调用swap1函数实参值不会做交换, 只有swap 2作交换, 代码的输出结果为:3, 5, 5, 3。 3.2 指针变量作为函数参数 指针变量作为函数形参也经常应用在数组作为实参的函数调用中。如以下代码: 针对数组或指向数组的指针, 各有两种表现形式:数组形式或指针形式。如:int a[10];数组的引用可以有常用的数组形式:a[2], 也可以有指针形式:* (a+2) 。同样的对于指向数组的指针, 如int*p=&a[2], 也有指针形式:* (p+2) 和数组形式p[2], 都等价于a[4]。 4结语 本文在简要介绍指针的概念和指针变量的基础上, 着重介绍了指针与数组的关系, 通过示例说明了指向一维数组的指针以及二维数组的指针, 特别是二维数组名作为二级指针的引用和字符串指针的应用;最后介绍了值传递与地址传递以及指针作为函数参数的应用。 摘要:C语言作为计算机类专业一门重要的基础课程, 是学生学习程序设计的开端, 后续专业课程大多以此作为前提。而在C语言的学习中, 指针又是一个重点以及难点。文章首先介绍了指针的概念以及指针变量的定义, 其次重点介绍了指针与数组之间的关系, 最后介绍了值传递以及地址传递的区别以及指针变量作为函数参数的应用。 关键词:C语言,指针,指针变量,地址传递 参考文献 [1]吉顺如.C语言程序设计教程[M].北京:机械工业出版社, 2011. [2]李师贤, 译.C++Primer中文版:第4版[M].北京:人民邮电出版社, 2006. 1、设一棵满二叉树共有15个结点,则在该满二叉树中的叶子结点数为()。 A.7 B.8 C.9 D.10 参考答案:B 参考解析:在具有n个结点的满二叉树,其非叶子结点数为int(n/2),而叶子结点数等于总结点数减去非叶子结点数。本题n=15,故非叶子结点数等于int(15/2)=7,叶子结点数等于15-7=8。 2、数据流图用于抽象描述一个软件的逻辑模型,数据流图由一些特定的图符构成。下列图符名标识的图符不属于数据流图合法图符的是()。 A.控制流 B.加工 C.存储文件 D.源和潭 参考答案:A 参考解析:数据流图用于抽象描述一个软件的逻辑模型,它由一些特定的图符构成,包括4个方面,即加工、数据流、存储文件、源和潭。 3、对关系S和R进行集合运算,结果中既包含S中的所有元组也包含R中的所有元组,这样的集合运算称为()。 A.并运算 B.交运算 C.差运算 D.积运算 参考答案:A 参考解析:关系的并运算是指由结构相同的两个关系合并,形成一个新的关系,新关系中包含两个关系中的所有元组。 4、下列方法中,属于白盒法设计测试用例的方法的是()。 A.错误推测 B.因果图 C.基本路径测试 D.边界值分析 参考答案:C 参考解析:白盒测试方法也称为结构测试或逻辑测试,主要方法有逻辑覆盖测试、基本路径测试等。 5、设R是一个2元关系,有3个元组,S是一个3元关系,有3个元组。如T=RX S,则T的元组的个数为()。 A.6 B.8 C.9 D.1 2参考答案:C 参考解析:R为n元关系,有P个元组S为m元关系,有q个元组。两个关系笛卡儿积是一个n+m元的关系,元组个数是qXp。所以T的元组的个数为9个。 6、在数据库系统中,数据库用户能够看见和使用的局部数据的逻辑结构和特征的描述是()。 A.外模式 B.逻辑模式 C.概念模式 D.物理模式 参考答案:A 参考解析:外模式也称子模式,它是数据库用户(包括应用程序员和最终用户)能够看见和使用的局部数据的逻辑结构和特征的描述,它是由概念模式推导出来的,是数据库用户的数据视图,是与某一应用有关的数据的逻辑表示。…个概念模式可以有若干个外模式。 7、数据管理技术发展的三个阶段中,()没有专门的软件对数据进行管理。 I.人工管理阶段 II.文件系统阶段 Ⅲ.数据库阶段 A.仅I B.仅Ⅲ C.I和II D.II和Ⅲ 参考答案:A 参考解析:数据管理技术发展的兰个阶段中,只有人工管理阶段,没有操作系统,没有管理数据的软件,数据处理方式是批处理。在文件系统阶段,操作系统中已经有了专门数据管理软件,一般称为文件系统。在数据库系统阶段,出现了统一管理数据的专门软件系统,即数据库管理系统。 8、数据库系统的核心是()。 A.数据模型 B.软件开发 C.数据库设计 D.数据库管理系统 参考答案:D 参考解析:数据库管理系统DBMS是数据库系统的核心。DBMS是负责数据库的建立、使用和维护的软件。DBMS建立在操作系统之上,实施对数据库的统一管理和控制。用户使用的各种数据库命令以及应用程序的执行,最终都必须通过DBMS。另外,DBMS还承担着数据库的安全保护工作,按照DBA所规定的要求,保证数据库的完整性和安全性。 9、以下叙述正确的是()。 A.变量的作用域取决于变量定义语句的位置 B.全局变量可以在函数以外的任何部位进行定义 C.局部变量的作用域可用于其他函数的调用 D.一个变量说明为static存储类型是为了限制其他编译单元的引用 参考答案:D 参考解析:本题考查函数调用的变量作用域。全局变量不在任何函数俸内定义,作用域为整个文件i局部变量在函数体内定义,作用域仅为本次函数;static类型是静态变量,为了方便其他编译单元的引用,不能随意改变。一个函数包含两部分:函数首和函数体,函数体包括花括号内的所有语句。 10、下列选项中,不属于数据管理员(DBA)职责的是()。 A.数据库维护 B.数据库设计 C.改善系统性能,提高系统效率 D.数据类型转换 参考答案:D 参考解析:数据库管理员(DataBaseAdministrator,DBA)是指对数据库的规划、设计、维护、监视等的人员,其主要工作如下: ·数据库设计。DBA的主要任务之一是数据库设计,具体地说是进行数据模式的设计。 ·数据库维护。DBA必须对数据库中的数据安全性、完整性、并发控制及系统恢复、数据定期转储等进行实施与维护。 ·改善系统性能,提高系统效率。DBA必须随时监视数据库的运行状态,不断调整内部结构,使系统保持最佳状态与效率。 下列给定程序中,函数fun的功能是:在形参S所指字符串中寻找与参数C相同的字符,并在其后插入一个与之相同的字符,若找不到相同的字符则不做任何处理。 例如,若s所指字符串为“baacda”,c中的字符为a,执行后S所指字符串为“baaaacdaa”。 请在程序的下画线处填入正确的内容并将下画线删除,使程序得出正确的结果。 注意:部分源程序给出如下。 不得增行或删行,也不得更改程序的结构! 试题程序: 参考解析: 【参考答案】 【解题思路】 填空1:for语句循环条件是判断是否到达字符串结尾,即当前字符是否为‘’。 填空2:while语句用以确定字符串的长度,所以变量n赋初值为0。 填空3:题目要求如果找到与参数c相同的字符,就在后面插入一个相同的字符,且找到后应该给数组元素赋值,本题目给出参数为c。 二、程序修改题 [简答题] 下列给定程序中函数fun的功能是:逐个比较p、q所指两个字符串对应位置上的字符,并把ASCII值大或相等的字符依次存放到c所指的数组中,形成一个新的字符串。 例如,若主函数中a字符串为“aBCDeFgH”,b字符串为“Abcd”,则c中的字符串应为“aBcdeFgH”。 请改正程序中的错误,使它能得出正确的结果。 注意:部分源程序在文件MODl1.C中,不得增行或删行,也不得更改程序的结构! 参考解析: 【参考答案】(1)int k=0; (2)while(*p||*q) 【考点分析】 本题考查:变量初始化,需根据题意确定变量含义,然后对其进行初始化操作;while循环语句。 【解题思路】 (1)变量k存放数组e的下标,因此应初始化为0。 (2)while循环语句的循环条件是判断两个字符串是否到达结尾。三.程序设计题 [简答题] 规定输入的字符串中只包含字母和*号。请编写函数fun,其功能是:将字符串尾部的*号全部删除,前面和中间的*号不动。 例如,字符串中的内容为:“****A*BC*DEF*G*******”.删除后,字符串中的内容应当是:“****A*BC*DEF*G”。在编写函数时,不得使用C语言提供的字符串函数。 注意:部分源程序在文件PROG1.C中。 请勿改动主函数main和其他函数中的任何内容,仅在函数fun的花括号中填入你编写的若干语句。 参考解析: 【参考答案】 【考点分析】 本题考查:删除字符串尾部+号;删除的主要思想是把不删除的字符保留起来。 【解题思路】 对于一个字符串要删除其尾部的*号,只需要在最后一个不是*号的字符后面加上结束符号‘’。具体操作为:首先找到字符串的结尾,然后从最后一个字符开始往前逐个判断是否为*号,直到找到非*号字符为止,最后在该字符后面加上结束符号‘’。 模拟卷2 一、程序填空题 [填空题] 下列给定程序中,函数fun的功能是:从形参ss所指字符串数组中,删除所有串长超过k的字符串,函数返回剩余字符串的个数。ss所指字符串数组中共有N个字符串,且串长小于M。 请在程序的下划线处填入正确的内容并将下划线删除,使程序得出正确的结果。 注意:部分源程序在文件BLANK1.C中。 不得增行或删行,也不得更改程序的结构! 参考解析: 【参考答案】(1)N (2)k (3)ss[i] 【考点分析】 本题考查:for循环语句;if语句条件表达式;字符串拷贝函数strepy的使用。 【解题思路】 填空l:for循环语句作用是遍历字符串数组中的每一个字符串,所以循环变量i的循环条件是i 填空2:题目要求删除串长度小于k的字符串,所以if条件语句的条件表达式是len<=k。 填空3:通过字符串拷贝函数将串长不大于k的字符串另存,并记录个数。 【解题宝典】 字符串拷贝函数strcpy,其格式为:strepy(字符数组名1,字符数组名2) 功能:把字符数组2中的字符串拷贝到字符数组l中。字符串结束标识‘’也一同拷贝。字符数名2,也可以是一个字符串常量。这时相当于把一个字符串赋予一个字符数组。 二、程序修改题 [简答题] 给定程序MODI1.C中,函数fun的功能是:判断输入的任何一个正整数n,是否等于某个连续正整数序列之和。若是,则输出所有可能的序列,否则输出“不能分解”。 例如:当输入100时,输出:100=9+10+11+12+13+14+15+16 100=18+19+20+21+22 请改正函数fun中指定部位的错误,使它能得出正确的结果。 注意:不要改动main函数,不得增行或删行,也不得更改程序的结构。 试题程序: 参考解析: 【参考答案】(1)m=n; (2)m=m-c;c++; (3)if(m==0) 【解题思路】 (1)每次循环,程序需要对n执行减去连续的正整数序列 来判断n是否刚好为0,即n是否是连续的正整数序列之和,所以需要使用临时变量m寄存n的值,每次循环对m执行减运算操作,不满足继续下一轮。另外,程序声明变量m时,未初始化它的值,所以此处应该修改为:m=n。 (2)语法错误。C语言中每个语句必须以分号结束,所以应修改为:m=m-c;c++。 (3)题目判断n是否是连续的正整数序列之和,若是,则输出所有序列,程序中m依次减去连续的正整数,当m为0时,表示m(即11)满足条件,再输出当前序列中的每个正整数,所以此处判断条件反了,应修改为:if(m==0)。3 [简答题] 请编写函数fun,其功能是:移动一维数组中的内容,若数组中有n个整数,要求把下标从0~P(含P,P小于等于n-1)的数组元素平移到数组的最后。 例如,一维数组中的原始内容为:1、2、3、4、5、6、7、8、9、10;P的值为3。移动后,一维数组中的内容应为:5、6、7、8、9、10、1、2、3、4。 注意:部分源程序给出如下。 请勿改动主函数main和其他函数中的内容,仅在函数fun的花括号中填入你编写的若干语句。 试题程序: 参考解析: 【参考答案】 【解题思路】 本题要求把下标从0~P(含P,P小于等于n-1)的数组元素平移到数组的最后,可以根据输入的P值,通过for循环语句,将P+1-n-1(含n-1)之间的数组元素依次向前移动P+1个存储单元,即W[j-1]=w[j];,同时将0~P个数组元素逐一赋给数组w[n-1],也就是通过语句w[n-1]=ch;来实现此操作的。 一、程序填空题 [填空题] 给定程序中,函数fun的功能是:将形参给定的字符串、整数、浮点数写到文本文件中,再用字符方式从此文本文件中逐个读入并显示在终端屏幕上。 请在程序的下画线处填入正确的内容并把下画线删除,使程序得出正确的结果。 注意:部分源程序给出如下。 不得增行或删行,也不得更改程序的结构! 试题程序: 参考解析: 【参考答案】 【解题思路】 填空1:由语句fopen(“filel.txt”,“r”)可知,fp应该是文件类型指针,因此本空应该填写FILE *。 填空2:feof函数只能对文件类型数据进行操作,因此本空应填写fp。 填空3:putchar()代表输入一个字符,从ch=fgetc(fp)可以看出本题应该填写ch。 二、程序修改题 [简答题] 给定程序中函数fun的功能是:首先把b所指字符串中的字符按逆序存放,然后将a所指字符串中的字符和b所指字符串中的字符,按排列的顺序交叉合并到C所指数组中,过长的剩余字符接在C所指的数组的尾部。例如,当a所指字符串中的内容为“abcdefg”,b所指字符串中的内容为“1234”时,C所指数组中的内容应为“a4b3c2dlefg”;而当a所指字符串中的内容为“1234”,b所指字符串的内容为“abcdefg”时,C所指数组中的内容应该为“192f3e4dcba”。 请改正程序中的错误,使它能得出正确的结果。 注意:部分源程序在文件MODI1.C中,不要改动main函数,不得增行或删行,也不得更改程序的结构! 试题程序: 参考解析: 【参考答案】 【解题思路】 (1)由i和j定义的初始值可知,此处应该判断i是否小于j,所以应改为while(i (2)此处将if错写成If,这个错误比较简单,但往往不容易发现。三.程序设计题 [简答题] 请编写一个函数void fun(int m,int k,int xx[]),该函数的功能是:将大于整数m且紧靠m的k个素数存入所指的数组中。 例如,若输入17,5,则应输出19、23、29、31、37。 注意:部分源程序在文件PROG1.C中。 请勿改动主函数main和其他函数中的任何内容,仅在函数fun的花括号中填入你编写的若干语句。 试题程序: 参考解析: 【参考答案】 【解题思路】 关键词:C语言,指针,数组,函数 指针是C语言中的精髓,它在C语言中被广泛的使用。理解和运用好指针可以灵活方便地处理程序中各种复杂问题,可以轻松完成其他高级程序设计语言不便完成的任务。 一、指针的概念 一个指针变量的值就是某个内存单元的地址或称为某内存单元的指针。 指针的引入为系统存取数据提供了一种“间接访问”方式。所谓间接访问,是先访问存放变量地址的存储单元,得到该变量的地址,再对变量内容进行访问。 指针变量是一种特殊变量。系统为指针变量分配一块连续存储单元不是供其存储数据,而是存储内存地址。因此,指针变量是存储内存地址的变量。 二、指针的类型 1、指向简单变量的指针。指针所知的数据类可以使简单的数据类型。 例:(1)int*p,i;p=&i;意思是指针变量指向整型变量i (2)char*p,a;p=&a;意思是指针变量指向字符型变量a (3)int*p,a[10];p=a;意思是指针变量指向数组a 2、指向数组的指针。指针所指的数组既可以是一维数组,也可以是多维数组。 分析:指针P指向了a数组的首地址,通过p++来访问a数组的每一元素。 3、指针数组。数组元素是由指针变量组成的一种指针。定义如:nt*p[2];指针数组p包含两个元素,每个元素指向一个整型数据。 分析:指针P是一个数组,通过for循环语句给指针数组中的每个指针变量赋值,p[1]的初值为数组a的第二行的首地址,*(p[1]+1)便是元素a[1][1],因此程序输出7。 4、指向指针的指针。指针变量指向的是指针的地址,定义如:int**p。 分析:指针数组p的各个指针变量指向数组a的各行首地址,q指向指针数组p的首地址,*(q+1)等同p[1],如此,*(*(q+1)+1)便等同*(p[1]+1)也就是a[1][1],因此程序输出7。 5、指向函数的指针。指针变量指向函数的首地址,然后通过该指针变量调用该函数。定义如:int(*p)()。 分析:int (*p)()表示定义了一个指向函数的指针变量,函数名max代表了函数的入口地址,执行p=max后,p指向了函数max,(*p)(a,b)便是通过p调用函数max。 6、指向文件的指针。C语言对文件的操作并不是直接通过文件名进行的,而是根据文件名生成一个文件指针,通过该指针来对文件进行操作.定义如:FILE*fP(fp为文件指针,此时fp不指向任何文件)。 三、指针应用中常见的错误 1、把数据赋给指针变量。指针在使用前必须进行初始化,赋予指针的值必须是地址。 正确语句:p=&i;“&”是一个取变量地址的运算符。 2、指针常量运算错误。程序中常量指针是不能被修改的。典型有数组名指针常量和指向字符串常量的指针。 3、指针赋值类型不一致 正确语句:p=a[0];或p=&a[0][0];如果一定把a赋值给p,必须先将a转换成整型指针类型,如:p=(int*)a;。特别是将多维数组赋值给指针变量时应注意类型匹配。 参考文献 [1]陈建辉,C语言指针探讨[M]·莆田高等专科学校学报,2001 [2]施冬梅,C语言指针教学中应注意的几个方面[M].镇江高专学报,2004 第一部:备考篇 “名将不打无准备之仗”,复习备考的好坏,是能否顺利通过上机考试的关键。对上机考试的学习、备考过程,实际上是一个由生疏到精通的渐进过程。随着考试系统的完善,那种借投机取巧、怀着侥幸心理应对考试的做法是行不通的,考生必须认识到只有做好了考前复习,才能确保自己的上机考试顺利通过。 下面对复习备考中的一些技巧和注意事项做个简单陈述,这些是在复习备考中就应该养成的好习惯。 首先,应先打下扎实的C语言基础,对C语言的一些基本结构和用法必须有清晰的了解,本文以谭浩强的《C程序设计》为例,说明各章节在备考机试时应注意的内容。 1、数据类型和各种运算符:这里应该注意变量的使用语法。C语言规定,各种变量在使用前要先定义,但有部分考生受VB或其它语言的影响,在使用前不对变量定义,从而产生错误,不能通过编译环节。还有些考生在定义后,往往对变量不进行初始化,就拿到程序中应用,由于这种作法,并没有语法上的错误,所以C语言的编辑器查不出错误,但是这可能会导致结果与题目要求相差很大,且在考生排除错误时,不容易找出错误的所在。 笔者建议考生,在定义过变量后,应对所有变量进行初始化,以养成好的编程风格,最好定义变量后,在附近代码行中进行初始化。 运算符中要注意赋值运算符“=”和关系运算符“==”的区别,根据人们常有的思维定势,常把数学运算符中的“=”,当做C语言中的关系运算符“==”,例如在一个程序段中,有如下判断语句: if (表达式1==表达式2) 语句1 …… 如果把条件中的“==”误写成“=”,就变成了把表达式2的值赋给表达式1,只要表达式2的值不为零,则条件恒成立,这当然与编写者的意思不符了。 2、C语言的三种常用结构:顺序、选择、循环,顺序结构没什么难点,这里只谈论选择结构和循环结构。 常用的选择语句是if( )语句和switch( )语句,当if( )语句后有多个else时,应当注意else总是与它上面、离它最近的一个if相配对,这点在读、写程序时都应注意。switch( )语句常与case、break等关键字结合使用,应该注意switch(表达式)中的“表达式”,必须有一个定值,即可以是常量、常量表达式、字符常量等,而不能是一个“变动着的值或表达式”;在执行相应的case分支时,如果分支语句后没有出现“break”,则即便case “表达式”中“表达式”的值,与switch(表达式)中“表达式”的值相等,程序也不会跳出分支,仍然会继续逐条的执行。如下段程序输出a的值: switch(3) { case 1 : a=1; case 3 : a=3; case 5 : a=5; } 程序执行后,变量a的值是5,而不是3。 循环应该注意循环条件的设定,一定要度绝死循环,在一些占用内存的操作中,如果出现死循环,则很容易导致死机,在机试考试中出现死机现象,很可能会导致考试的失败。 3、数组:对于数组,上机考试中没有单独考过,但每年的考题中都少不了数组的应用,象一些从文件中读取英文文章,根据行列关系存入二维数组中;读整数存入一维或二维数组中等。对于这类问题,常常需要应试者借助一些中转数组来完成,考生使用自己定义的数组时,应该特别注意一点,数组在定义后一定要初始化,特别对于字符数组,象上面提到的读英文字符串到数组中,如果考生自己定义的数组没有初始化,当定义数组的列数大于字符串的长度时,后面一部分没有初赋值的数组元素将产生乱码或特殊字符,考生可以用memset(string, 0, count)函数来初始化数组,也可用循环语句来初始化数组。 4、函数:三级机试的内容就是编写一个函数,这章的重要性就不用多说了吧,重点很多,教材上讲的很详细,本文只提醒大家一点,考生在解题前应看懂各函数间的互调关系,注意形参和实参的数据类型,确保形参和实参的数据类型一致, 5、指针:指针是C语言的精华,也是机试考查的重点内容,这里应该注意,指针的类型必须与所指元素的类型相同,另外一定要度绝“野指针”的使用,所谓野指针是指指针定义后,在使用之前没有初始化。指针的初始化比变量和数组的初始化更重要,没有初值的指针是很危险的,除了一定得不到正确答案外,当指针越界后,很容易引起死机,如果说死循环带来的死机是“假死”,大部分可以用“Ctrl+C”来恢复,但指针越界引起的死机却是“真死”,很难进行恢复,这点请考生一定牢记。 6、结构体:结构体也是每年必考的内容,题型大多以“产品问题”、“学生问题”的型式来体现。网友在复习结构体一部分内容时,要主意结构体名称和结构体变量之间的区别,当涉及到结构体数组时,应该熟悉结构体元素的调用方法,结构体变量间的赋值、比较方式等。只要将谭浩强《C语言程序设计》教材中本章节的练习作一遍,即可顺利通过此类试题的考试。 7、位运算和文件的读写操作:这部分内容知识面较少,考生只需要了解位的几种特殊运算,文件操作一章中的读文件函数、写文件函数、打开文件函数、关闭文件函数等几个主要函数。 第二部:练习篇 考生完成按章节复习后,应抽出一个月或半个月时间,进行各种模拟练习,熟悉考试中的相关软件的使用方法和技艺,只有这样,才能在考试中不会因为各种软件的佰生而失分。这部分内容包括常用DOS命令的使用、UCDOS汉字平台的使用、TC编辑环境的使用。 1、常用DOS命令的使用:三级上机考试,对DOS命令不进行考核,但笔者认为,考生若想顺利通过考试,必须熟知一些常用的DOS命令,例如CD、RD、EDIT等。其中EDIT尤其有用,考生在解题后,大多考题会生成一个输出文件,存放程序执行后的结果,可以用EDIT命令打开此文件,判断程序执行的结果是否正确。 2、UCDOS汉字平台的使用:UCDOS曾是DOS环境下风靡一时的中文操作平台,后来由于WINDOWS的崛起而逐渐退出,故而现在的很多考生,对UCDOS十分佰生,UCDOS本身的功能很多,但在三级考试环境中,只起到一个中文显示作用,考生只需会使用以下命令进入UCDOS即可。 C: > UCDOS (回车) 或:C: > UP (回车) 进入UCDOS后,考生可以根据需要,调出自己熟悉的汉字输入法,时行汉字输入,并可在中、英文间随意切换。下面是UCDOS的一些常用组合I。 ALT+F5 五笔输入法 ALT+F6 英文输入法 ALT+F1 区位码输入法 ALT+F2 全拼输入法 ALT+F3 双拼输入法 CTRL+F9 全角半角互换 对于UCDOS中文平台,考生只需了解以上几点就可以了。 注:对于有些考场中的计算机,在UCDOS下运行TC2.0时,UCDOS的快捷键分屏蔽掉TC中同名的快捷键,请考生注意区分使用。 3、TC2.0的使用:TC2.0是计算机等级考试C语言上机的指定软件,在各种书上都有大量的介绍,这里不再多说,考生只需注意一点,在每次修改程序后,均要先保存、后执行。 熟悉上面三种软件后,考生只需再购买一种上机模拟软件,对相关内容进行模拟练习,至于购买那种模拟软件更好,在下认为模拟软件发展到现在,功能上已区别不大,只看考生自己的爱好了。 第三部:应试篇 在应试中,我想最注意的还是考生的心态问题,凡是参加等级考试的考生,均经过无数次的考试,但因它的特殊性,试考生对这种考试方式有一种神秘感和佰生感,容易引起一定的恐慌,其实这是没有必要的,只要考生按文中所提,踏踏实实的做好了以上两部,第三部就是瓜熟蒂落,水到渠成的事了。 但机试中并非无技巧可言,笔者总结一下,可用“一看、二写、三检查”来形容。 “一看”是指考生在抽取考题后,不要先及着写相应函数,应将整个程序从头到尾通读一遍,清楚各函数间的互调关系,程序中的那些变量是全局变量,可以直接使用,那些是局部变量,只能在本函数内部使用。 “二写”指考生了解程序大至结构后,根据题意,可先在草纸上画出程序的流程图,设计实现题意的算法,这些工作完成后,代码的实现就是很简单的事了。 (1)设置自动语法检查 打开工具菜单 → 单击选项命令 → 选择 编辑器 页面 →将 自动语法检测 勾上。 (2)利用VB调试工具栏 利用该工具栏可以运行程序、中断运行、在程序中设置间断点、监视变量、单步调试、过程跟踪等操作。 2. VB的三种模式 (1)设计模式 在设计模式下可以进行程序的界面设计、属性设置、代码编写等,标题栏上显示“设计”,在此模式下不能运行程序,也不能使用调试工具。 (2)运行模式 执行“运行”菜单中的“启动”命令或单击工具栏上的启动按钮或按F5键,即由设计模式进入运行模式,标题栏显示“运行”,在此阶段可以查看程序代码,但不能修改。若要修改,必须单击工具栏上的“结束”按钮,回到设计模式,也可以选择“中断”按钮,进入中断模式。 (3)中断模式 当程序运行时单击了“中断”按钮,或当程序出现运行错误时,都可以进入中断模式,在此模式下,运行的程序被挂起,可以查看代码、修改代码、检查数据。修改结束,单击“继续”按钮可以继续程序的运行,也可以单击“结束”按钮停止程序的执行。 3. 常见错误 (1) 编辑时错误 当用户在代码窗口编辑代码时,VB会对程序进行语法检查,当发现语句没有输完、关键字输错等情况时,系统会弹出对话框,提示出错,并在错误处加亮显示,以便用户修改。 (2)编译时错误 是指用户单击了“启动”按钮,VB开始运行程序前,先编译执行的程序段时产生的错误,此错误是由于用户未定义变量、遗漏关键字等原因而产生的。发现错误时系统会停止编译,提示用户修改。 (3)运行时错误 指VB在编译通过后,运行代码时发生的错误,一般是由于指令代码执行了非法操作引起的,如:数据类型不匹配、试图打开一个不存在的文件等。系统会报错并加亮显示、等候处理。 (4)逻辑错误 如果程序运行后得不到所希望的结果,则说明存在逻辑错误。如:运算符使用不正确,语句的次序不对、循环语句的起始、终值不正确。这种错误系统不会报错,需要用户自己分析判断。 4.程序调试方法 (1)进入/退出中断状态 进入中断状态有四种方法: 1) 程序运行时发生错误自动进入中断 2) 程序运行中用户按中断键强制进入中断 3) 用户在程序中预先设置了断点,程序执行到断点处即进入中断状态 4) 在采用单步调试方式,每运行一个可执行代码后,即进入中断状态。 (2) 利用调试窗口 1) 立即窗口 这是调式窗口中使用最方便、最常用的窗口。可以在程序中用Debug.Print方法,把输出送到立即窗口,也可以在该窗口中直接使用Print语句或?显示变量的值。 2) 本地窗口 该窗口显示当前过程中所有变量的值,当程序的执行从一个过程切换到另一个过程时,该窗口的内容发生改变,它只反映当前过程中可用的变量。 3) 监视窗口 该窗口可显示当前的监视表达式,在此之前必须在设计阶段,利用调试菜单的“添加监视命令”或“快速监视”命令添加监视表达式以及设置的监视类型在运行时显示在监视窗口,根据设置的监视类型进行相应的显示。 (3)插入断点和逐句跟踪 在调试程序时,通常回设置断点来中断程序的运行,然后逐句跟踪检查相关变量、属性和表达式的值是否在预期的范围内。 可在中断模式下或设计模式时设置或删除断点,在代码窗口选择怀疑存在问题的地方作为断点,按下F9键,则程序运行到断点处即停下,进入中断模式,在此之前所关心的变量、属性、表达式的值都可以看到。 1.计算机等级考试二级VB考点:VB的过程设计 2.计算机等级考试二级VB考点:自定义数据类型 3.计算机等级考试二级VB考点:控件数组 4.计算机等级考试二级VB考点:进程条和滑块 5.计算机等级考试二级VB考点:排列显示和分层显示控件 6.计算机等级考试二级VB考点:常用文件操作语句和函数 7.计算机等级考试二级VB考点:动态数组及声明 8.计算机等级考试二级VB程序设计题 9.计算机等级考试二级VB程序设计模拟试题 随着计算机技术的飞速发展及应用领域的扩大, 熟练掌握一门语言已变的尤为关键。C语言这门课程在计算机的基础教学中一直占有比较重要的地位, 然而要想突破C语言的学习, 对函数和指针的掌握是非常重要的, 本文将具体针对函数和指针的关系做详尽的介绍。 一、函数的有关概念 为了使程序的编写更加清晰、直观且易于修改, C语言中引用了函数。所谓函数, 就是一个程序模块, 该模块用来完成一个特定的程序功能。引用一个函数时, 需要包括对函数的定义、声明, 继而调用。在掌握函数相关概念的同时, 有以下几点需要注意: (1) 调用函数和被调用函数 由上例可以看出, 函数A在执行的过程中包括了对函数B的调用, 则函数A称为调用函数 (调用函数B) , 而函数B被函数A调用, 称为被调用函数。 (2) 实参和形参 调用函数中定义的变量是实参, 被调用函数中定义的变量是形参。如上例, 函数A中的变量a是实参, 函数B中的变量b是形参。 (3) 实参变量和形参变量之间的独立性 实参变量和形参变量之间只存在值的传递过程, 实参变量的存储空间在调用函数中分配, 而形参变量的存储空间在被调用函数中分配, 被调用函数执行完毕后, 其所分配的存储空间被释放, 即形参变量的存储空间被释放, 它不会返回值给实参变量, 也不会参与调用函数的继续执行。例如 (实现两个数的交换) : 显然, 函数main是调用函数 (调用函数swap) , 函数swap是被调用函数。main函数中的a, b由main函数分配存储空间, 而swap函数中的a, b由swap函数分配存储空间。main函数执行到swap函数时, 调用swap函数, swap函数为其变量分配存储空间, 然后实现了swap函数中变量a, b的值交换, 执行完毕后即释放其分配变量的存储空间。继而, main函数继续执行, 但其变量a, b没有做任何改变, 即main函数不能实现a, b的交换。由上例可以看出, 若单纯的使用变量, 则被调用函数无法改变调用函数中的变量值, 即swap函数无法实现main函数中变量a, b的交换。 二、指针的有关概念 指针是C语言中功能最强大, 使用最广泛的一种数据类型, 主要用于描述存储单元的地址。通过使用指针, 可以在函数中进行传址调用。 (1) 指针变量的定义 定义指针变量的一般形式:类型标识符*变量名;其中, 变量名前的符号“*”表示将要定义的变量, 类型说明符表示该指针变量所指向数据的类型。例如:int*p1;char*p2;float*p3; (2) 指针变量的引用 &为取地址运算符, 其一般形式为:&变量名, 例如: int x=3, *p;p=&x;指针变量p指向变量x。 在使用x的值时, 可以直接使用x, 也可以用*p来代替使用x。此外, 指针变量一定是和它所对应的变量相互引用, 即指针变量在使用时一定要有明确的指向, 必须赋予具体的值, 否则将可能导致错误。 三、指针与函数的关系 在函数的编写过程中, 若单纯的只用变量参数, 则无法实现被调用函数改变调用函数中变量值的目的。而为了实现这一目的, 就需要函数和指针之间的结合使用。 (1) 引用指针, 可以实现调用函数和被调用函数中的指针变量共同指向调用函数中的存储单元, 从而实现被调用函数改变调用函数中变量值的目的。例如: 由上例可以看出, 在调用函数 (main函数) 中定义了变量a和指针变量p1, 被调用函数 (change函数) 中定义了指针变量p2。程序首先从main函数开始执行, 分配变量a和指针变量p1的存储单元, 此时指针变量p1指向变量a (p1=&a) 。当程序执行到change函数时, 程序跳转到change函数执行其函数体, change函数为其指针变量p2分配存储单元, 同时p2也得到了p1传过来的值 (变量a的地址) , 此时p2也指向了调用函数中的变量a, 即实现了p1和p2共同指向了调用函数中的存储单元 (变量a的存储单元) , change函数执行其函数体 (*p2=3) , 即使a的值变为3。change函数执行完毕后, 释放其变量的存储空间, 转而继续执行main函数, 此时a的值已经发生改变 (由2变为3) , 实现了被调用函数改变调用函数中变量值的目的。 (2) 调用函数和被调用函数中实参和形参之间的关系图 被调用函数执行完毕后, 释放它所分配的存储单元, 而调用函数分配的存储单元仍继续使用。此外, 只有当调用函数中传指针值 (即实参是指针值) , 而被调用函数中引用变量 (即形参收到指针值后, 在函数体内引用变量值) , 才能达到改变的目的。 例如, 实现变量a和b的交换, 程序如下: 例1虽然传的是指针值, 但在函数体的执行过程中引用的仍然是指针值 (引用x和y) , 所以不能实现a和b的交换;例2程序传指针值后, 引用变量 (*x和*y, 即a和b) , 所以能实现a和b的交换。 四、结束语 在以后的编程过程中, 若遇到想通过被调用函数改变调用函数中变量值的目的, 则可以把该变量的地址值传给被调用函数, 从而达到改变的目的。鉴于文章篇幅及个人能力有限, 本文肯定还存在许多不足之处, 仅供大家学习和参考。 参考文献 [1]谭浩强.C程序设计[M].二版.清华大学出版社, 2004. [2]杜友福.C语言程序设计[M].二版.科学出版社, 2007. 现在我定义了一个数组:int cc[10]; 围绕这个数组有好几种指针:cc, cc+1, &cc[0], &cc, &cc+1等等。你知道它们都是什么含义吗?试试运行以下带代码: ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 #include int main { int cc[10]; printf(“%x ”, cc); printf(“%x ”, cc+1); printf(“%x ”, &cc[0]); printf(“%x ”, &cc); printf(“%x ”, &cc+1); getchar(); return 0; } cc,这是学数组时第一个接触的“指针”,最为熟悉,它是数组的首个元素。 cc+1,这是指向数字第二个位置的指针。 &cc[0],这个其实就是cc,指向数组的首个元素。 &cc,这是什么玩意儿?指向指针的指针? &cc+1,如果上面的意思是指向指针的指针,那这个岂不是指向野地址了? 假设运行环境是32位机,并且数组首地址为0x28ff00,那么: cc的结果为0x28ff00,这点毫无疑问。 cc+1的地址是0x28ff04而不是0x28ff01,因为一个int占用了4个字节的空间。cc+1其实是当成cc+1*sizeof(int)来看待。 &cc[0]的结果是0x28ff00,cc[0]表示的是数组的首个元素,那么&cc[0]自然就是首个元素的地址了。&cc[0] == cc。 &cc,这个就难说了,指针cc的值是0x28ff00,&cc表示这个指针本身的地址,我们怎么可能会知道这个地址?输出是个随机地址吗?随机数的话这个输出完全没有意义啊。如果不是随机地址的话,难不成还是0x28ff00?这样的话a不就等于&a了?明显不对吧, 。。 对于基本类型的指针,如int *tt; 那么*tt是其值,&tt是指针的地址,&tt != tt 但是上述的cc是个数组,实际上,&cc被编译成了&cc[0],但是其含义不同,&cc指向的是整个数组的开头。&cc与cc的指向可以用下图来形象表示: 上图可以看出,&cc其实代表的是int(*)[10],那么&cc+1就可以理解为cc + sizeof(cc)/4,之所以除以4是因为int型指针++其实是移动了4个字节。 又或者说%cc == cc + sizeof(cc)/4 == cc + 10,所以&cc+1的值为0x28ff28。 可见我们平常使用的数组名,并不能单纯的当成指针看待。数组名的本质是代表数组对象的变量名,是一个左值,是一个不能被改变的左值。但是由于在程序中不保存数组的大小,所以通过数组名只能访问数组的左值,不能访问数组的右值。由于这个原因,数组名在作为右值使用的时候被赋予另外一个新的意义——指向数组第一个元素的指针,这就是array-to-pointer转换规则。根据标准规定,只有当数组名作为sizeof、&运算符的操作数的时候,它是一个左值,其类型为数组类型。除此之外的所有情况,数组名都是一个右值,被编译器自动转换为指针类型,这种情况下我们就说数组名是一个指针,并且是一个指针常量。 接下来是另外一些有趣的东西,我们结合sizeof与数组输出各类值。以下程序的输出结果是什么?建议思考后再运行程序来验证答案。 ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 #include int main() { int cc[10]; printf(“%d ”, sizeof(cc[0])); printf(“%d ”, sizeof(cc)); printf(“%d ”, sizeof(&cc)); printf(“%d ”, sizeof(int(*)[10])); getchar(); return 0; } sizeof(cc[0]),一个int的大小,输出4,没问题。 sizeof(cc),注意不要和上面搞混,这不是数组首地址的指针,cc在这里是左值,其为数组类型,所以结果为40。 sizeof(&cc),这个的答案应该是多少呢?注意了,cc在这里还是左值,其为数组类型,但&cc不同于cc,不管数组怎么复杂它始终是个指针,32位机上指针大小始终是4个字节,所以结果为4。 1.(A)是构成C语言程序的基本单位。 A、函数 B、过程 C、子程序 D、子例程 2.C语言程序从(C)开始执行。 A、程序中第一条可执行语句 B、程序中第一个函数 C、程序中的main函数 D、包含文件中的第一个函数 3、以下说法中正确的是(C)。 A、C语言程序总是从第一个定义的函数开始执行 B、在C语言程序中,要调用的函数必须在main()函数中定义 C、C语言程序总是从main()函数开始执行 D、C语言程序中的main()函数必须放在程序的开始部分 4.下列关于C语言的说法错误的是(B)。 A、C程序的工作过程是编辑、编译、连接、运行 B、C语言不区分大小写。 C、C程序的三种基本结构是顺序、选择、循环 D、C程序从main函数开始执行 5.下列正确的标识符是(C)。 A、-a 1B、a[i] C、a2_i D、int t 5-8题为相同类型题 考点:标识符的命名规则 只能由字母、数字、下划线构成数字不能作为标识符的开头 关键字不能作为标识符 选项A中的“-”,选项B中“[”与“]”不满足(1);选项D中的int为关键字,不满足(3) 6.下列C语言用户标识符中合法的是(B)。 A、3ax B、x C、case D、-e2 E)union 选项A中的标识符以数字开头不满足(2);选项C,E均为为关键字,不满足(3);选项D中的“-”不满足(1); 7.下列四组选项中,正确的C语言标识符是(C)。 A、%x B、a+b C、a12 3D、12 3选项A中的“%”,选项B中“+”不满足(1);选项D中的标识符以数字开头不满足(2) 8、下列四组字符串中都可以用作C语言程序中的标识符的是(A)。 A、print _3d db8 aBc B、Iam one_half start$it 3pai C、str_1 Cpp pow while D、Pxq My->book line# His.age 选项B中的“”,”$”,选项D中“>”,”#”,”.”,”-”不满足(1);选项C中的while为关键字,不满足(3) 9.C语言中的简单数据类型包括(D)。 A、整型、实型、逻辑型 B、整型、实型、逻辑型、字符型 C、整型、字符型、逻辑型 D、整型、实型、字符型 10.在C语言程序中,表达式5%2的结果是 C。 A、2.5B、2C、1D、3%为求余运算符,该运算符只能对整型数据进行运算。且符号与被模数相同。5%2=1;5%(-2)=1;(-5)%2=-1;(-5)%(-2)=-1; /为求商运算符,该运算符能够对整型、字符、浮点等类型的数据进行运算,5/2=2 关键词:指针,数组,C语言 对于C语言编程新手来说, 经常认为"数组和指针是相同的"。其实这种说法是不完全正确的, 他们是有区别的。ANSIC标准6.542里建议: 注意下列声明的区别: extern int*x; extern int y[]; 第一条语句声明x是一个int型的指针, 第二条语句声明y是int型, 数组长度尚未确定, 其存储在别处定义。 标准里并没有做更细的规定, 许多C语言书籍对数组和指针何时相同、何时不同也是含糊其辞一带而过。为了更好地理解指着与数组, 在这里我们谈谈他们之间的区别。 一、数组和指针的不同之处 我们来看以下代码: 程序编译时出错, 在这里, 数组a[100]与*a是两种不同的概念, 以上的错误相当于把浮点型数据和整型数据混为一谈, 如: 从上面, 我们可以很明显地看出int和char类型不匹配, 同理指针和数组两种不同类型也是不匹配。下面我们来谈谈是数组与指针的区别: 1. 指针和数组保存数据的内容不同 在C语言中, 我把地址形象地称为"指针", 把存放地址的变量称为指针变量, 通常我们把指针变量简称为指针, 所以指针里存放的是数据的地址, 而数组里存放的是数据的值。 2. 数组和指针的访问方式不同 数组采用的是直接访问方式, 而指针采用的是间接访问方式。 如:char a[6]="China"; c=a[3]; 程序编译时, 给数组分配内存, 如图: 假设编译器符号表给的一个地址是2000程序运行时, 取3的值, 将它与2000相加, 取得 (2000+3) 的内容。在这里, 每个符号的地址在编译时可知。因此, 如果编译器需要一个地址来执行某个操作得花, 它就可以直接地进行操作, 并不需要增加指令取得具体的地址。相反, 对于指针, 它必须首先在运行时取得它的当前值, 然后才能对它进行解除操作。 如:char*p="China"; c=p[3]; 编译器编译时, 编译器符号表给了一个p, 其地址假设为3000, 如图: 运行时, 取得地址3000的内容, 即5000, 后与3相加, 最后取 (5000+3) 的内容。 数组和指针的不同点还在于:指针通常由于动态数据结构, 而数组通常用于存储固定数目且数据类型相同的元素;指针用malloc () 、free () 函数来动态分配空间或释放空间, 而数组则隐式分配和删除;指针通常指向匿名数据, 而数组自身即为数据名;等。 二、数组和指针的相同之处 数组和指针什么时候相同呢? 1."作为函数参数的数组名"等同于指针 The C Programming Language, 第二版, Kernighan&Ritchie, 第99页里指出: 意思是:作为函数参数定义的形式参数, char s[]和char*s是一样的。 在函数形参定义这个特殊的情况下, 编译器必须把数组形式改写成指向数组第一个元素的指针形式。在这里, 编译器只向函数传递数组的地址, 而不是整个数组的拷贝。因此以下几种: 是一样的。 所以主函数的参数中char**argv和char argv[][]可以相互替换。 2."表达式中的数组名"就是指针, 数组下标作为指针的偏移量 假设我们声明: int a[10], *p, i=1; 就可以通过以下任何一种方式访问a[i]; p=a;p[i]; 或p=a;* (p+i) ; 或p=a+I;*p; 实际上, 我们还可以采用其它更多的方法。对于数组的引用如a[i]在编译时总是被编译器改写成* (a+i) 的形式。C语言标准要求编译器必须具备这个概念性的行为。我们可以这么记着:方括号[]表示一个取下标操作符, 就像减号表示一个减法运算符一样。取下标操作符就像取一个整数和一个指向类型X的指针, 所产生的结果类型是X, 一个在表达式中的数组名于是就成了指针。 在表达式中, 指针和数组是可以相互替换的, 因为他们在编译器里的最终形式都是指针, 并且都可以进行取下标操作。编译器可以自动把下标值的步长调整到数组的大小, 如:long型数据的长度是4个字节, 那么m[i]和m[i+1]在内存中的距离就是4, 而不是1。在对起始地址执行加法操作之前, 编译器会自动负责计算机每次增加的步长。这就是为什么指针总有类型限制的原因, 每个指针只能指向一种类型的原因是:因为编译器需要知道对指针进行解除引用操作时应该取多少个字节, 和每个下标的步长应取多少个字节。 三、总结 总而言之, 当声明时 (除作为函数参数除外) , 指针和数组是不能替换的, 如:"int a[10];", 只能用"extern a[10];", 而不能使用"extern*a;", 又如"int a[10];"和"in*a;"意义也是不同的;当作为函数参数或应用时, 两者是相同的, 如:"a[i]=5;"等同于"* (a+i) =5;", 又如, 主函数的参数中char**argv和char argv[][]可以相互替换。 参考文献 [1]谭浩强, C程序设计 (第三版) [M], 北京:清华大学出版社, 2005 [2]E.Balagurusamy, 标准C程序设计 (第4版) [M], 北京:清华大学出版社, 2008 【计算机二级C语言程序设计考点:指针】推荐阅读: 计算机等级考试二级VFP考点07-03 计算机二级MS office应用考点重点08-08 计算机等级考试二级VB考点:常用文件操作语句和函数07-09 计算机基础考点总结07-08 计算机二级access函数09-22 计算机二级vb试题答案09-07 计算机二级考试技巧分析11-07 全国计算机二级vb试题11-14 计算机二级考试VFP练习题09-26 计算机信息系统等级保护二级基本要求09-285.计算机二级c语言试题及答案 篇五
6.C语言的指针解析 篇六
7.计算机二级C语言测试题含答案 篇七
8.计算机二级C语言程序设计考点:指针 篇八
9.C语言指针的研究与运用 篇九
10.计算机二级C语言程序设计考点:指针 篇十
11.计算机二级C语言程序设计考点:指针 篇十一
12.C语言中的函数与指针 篇十二
13.C语言其实不简单:数组与指针 篇十三
14.计算机二级C语言考试试题及答案 篇十四
15.C语言中指针和数组区别的分析 篇十五