版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、.C语言第1章C语言的历史、特点第2章 C语言程序的基本结构第3章数据类型、运算符、表达式与基本语句第4章程序设计三种基本结构第5章 数组与函数第6章指针第7章编译预处理、结构体、共用体、位运算与文件操作第1章C语言的历史、特点11978年美电话电报公司(AT&T)的贝尔实验室正式发表了C语言。2C语言把括号、赋值、强制类型转换等作为运算符处理。3C语言的数据类型有整型、实型、字符型、数组型、指针型、结构体类型、共用体类型等。(树、栈、链表等为数据构)4C语言允许直接访问物理地址,能进行位(bit)操作。习题:1程序设计的基本步骤:编辑,编译,调试,连接和运行。第2章 C语言程序的基本
2、结构21 C语言的基本结构 注意事项:1程序的构成,main函数和其它函数2头文件,数据说明,函数的开始和结束标志函数的返回类型 函数名(参数1,参数2参数N) 变量参数部分; 执行过程部分; 返回值;3源程序的书写格式(1)C语言中有32个关键字,关键字是具有规定的意义,不能作为一般的标识使用。(2)C语言程序的编写是严格区分大小写的,一般大字母是表示常量。例题:一、选择题【例1】源程序中应包含一些内部文档,以帮助阅读和理解程序,源程序的内部文档通常包括选择合适的标识符注释和()。A.程序的视觉组织B.尽量不用或少用GOTO语句C.检查输入数据的有效性D.设计良好的输出报表【答案】A (源程
3、序文档中主要包括标识符命名,注释和视觉组织。)【例2】以下选项中合法的用户标识符是()。A.longB._2TestC.3DmaxD.A.dat【答案】B【例3】若已定义的函数有返回值,则以下关于该函数调用叙述错误的是()。A.函数调用可以作为独立的语句存在。B.函数调用可以作为一个函数的实参。C.函数调用可以出现在表达中。D.函数调用可以作为一个函数的形参。【答案】D在C语言中,当函数有返回值时可以作为表达式或表达式的一部分,而函数调用只能作为实参,不能作为形参。第3章数据类型、运算符、表达式与基本语句31数据类型注意事项: 1C语言的数据类型当整数的第一位是0时,则是八进制;当前两位为0x
4、时,则是十六进制表示;其它的则是十进制。而实型则是浮点小数。2整体数据的存储长度和范围的数据存储长度和范围,如:数据类型 位数 数值范围基本整形(int) 16 -3276832767短整形(short) 16 -3276832767长整形(long) 32 -21474836482147483647无符号整形(unsign) 16 65535无符号短整形(unsigned short) 16 065535无符号长(unsigned long) 32 042949672953常用的转义符字符形 功能 字符形 功能n 换行 t 水平制表(跳到下一个tab位置)v 竖向跳格 b 退格r 回车 f
5、走纸换页 反斜线字符“” 单引号ddd 1到3位八进制字符 xhh 1到2位十六进制字符 例题:一、选择题:【例1】以下只有在使用时才为该类型变量分配内存的存储类说明是()。A.auto和 staticB.auto和 registerC.register和 staticD.extern和 register【答案】B【例2】以下选项中合法的实型常数是()。A.5E2.0B.E3C.2E0D.1.3E【答案】C【例3】已知大写字母A的ASCII码的值是65,小写字母a的ASCII码是97,则用八进制表示字符常量101是()。A.字符AB.字符aC.字符eD.非法的常量【答案】A【例4】C语言中,函
6、数值类型的定义可以缺省,此时函数值的隐含类型是()。A.voidB.intC.floatD.double【答案】B【例5】以下选项中可作为C语言合法整数的是()。A.10110BB.0386C.0XffaD.x2a2【答案】C【例6】已定义c为字符变量,则下列语句中正确的是()。A.c=97B.c=“97”C.c=97D.c=“a”【答案】C【例7】设有以下变量定义,并已赋确定的值char w; int x; float y; double z;则表达式:w*x+z-y所求得的数据类型为( )。【答案】double32运算符注意事项:1.运算符种类运算符的种类可以分为算术运算符、关系运算符和逻
7、辑运算符。注意区分:(1)/和(整除) 对int型、float型和double型变量都适用,例如:8/3的结果是2,10/6的结果是1,如果整除是对于浮点数进行操作时,则其除法运算结果是一个浮点数,例如:8.0/3.0=2.0。(取余数) 运算符只适用开int型运算,不允许对浮点数)float或double)操作,对浮点型数进行操作会引起编绎错误。例如:7%4=3。(2)增1减1运算符分为前辍和后辍两种方式,前辍方式时运算符的作用在变量的前面,而后辍方式时运算符的作用在变量的后面,无论前辍还是后辍,运算后变量的都增1)或减1),但运算的顺序不同,例如:int a,b,c;a=2; b=+a;)
8、相当于执行:a=a+1;b=a;)结果b=3。c=a+;(相当于执行:c=a;a=a+1;)结果c=2 。变量a的值都变为3了。关系运算符逻辑运算符运算符名称! 逻辑非&& 逻辑与| 逻辑或优先级次序是:!级别最高,&&次之,|最低。运算符的主体可以是一个变量,也可以是一个表达式。例如:(1)int a=1;int b=0; a&&b;(2)int a=0;int b=1;int c=1;int d=1;(a+b)&&(c+d);逻辑运算符的值也是一个逻辑值,也就是1或0。其它运算符:位运算符:-(按位求反)、&(按位与)
9、、(按位或)、(按位异或)、<<(左移)、>>(右移)。赋值运算符:=(赋值运算符)+=、-=、*=、/=、%=、&=、|=、=、<<=、>>=。逗号运算符:表达式1,表达式2,表达式n三目运算符: (条件表达式)?(条件为真时的表达式):(条件为假时的表达式)例题一、选择题:【例1】设有 int x=11; 则表达式 (x+*1/3) 的值是()。A.3B.4 C.11 D.12【答案】A【例2】设 int x=1,y=1; 表达式(!x|y-)的值是()。A.0B.1C.2D.-1【答案】B【例4】C语言中运算对象必须是整型的运算符是
10、()。A.%= B./ C.= D.<=【答案】A【例5】若已定义x和y为double类型,则表达式x=1,y=x+3/2 的值是()。A.1 B.2 C.2.0 D.2.5【答案】B【例6】整型变量x和y的值相等、且为非0值,则以下选项中,结果为零的表达式是()。A.x | yB.x | yC.x & yD.x y【答案】D【例7】已有定义:int x=3,y=4,z=5;,则表达式!(x+y)+z-1 && y+z/2的值是()。A.6 B.0C.2 D.1【答案】【例8】设a和b均为double型变量,且a=5.5、b=2.5,则表达式(int)a+b/b的
11、值是()。A.6.500000B.6C.5.500000D.6.000000【答案】D【例9】下列关于单目运算符+、-的叙述中正确的是()。A.它们的运算对象可以是任何变量和常量。B.它们的运算对象可以是char型变量和int型变量,但不能是float型变量。C.它们的运算对象可以是int型变量,但不能是double型变量和float型变量。D.它们的运算对象可以是char型变量、int型变量和float型变量。【答案】D【例10】有以下定义语句double a,b; intw;long c;若各变量已正确赋值,则下列选项中正确的表达式是()。A.a=a+b=b+B.w%(int)a+b)C.
12、(c+w)%(int)aD.w=a=b【答案】C【例11】若x和y代表整型数,以下表达式中不能正确表示数学关系x-y<10的是()。A.abs(x-y)<10B.x-y>-10&&x-y<10C.!(x-y)<-10|!(y-x)>10D.(x-y)*(x-y)<100【答案】C【例12】设有定义语句:charc1=92,c2=92; 则以下表达式中值为零的是()。A.c1c2B.c1&c2C.c1c2D.c1|c2【答案】A【13】、以下程序段的输出结果是 。【提示:printf ()为右结合的运算】int y=7 ;prin
13、tf ( "%d %d %d ", +y, -y, y+ ) ;A 8 7 8B 8 7 7C 7 8 7D 7 8 8【答案】33表达式一、选择题【例1】若变量已正确定义并赋值,下面符合C语言语法的表达式是()。A.a:=b+1 B.a=b=c+2C.int 18.5%3D.a=a+7=c+b【答案】B【例2】若a为int类型,且其值为3,则执行完表达式a+=a-=a*a后,a的值是()。A.-3B.9C.-12D.6 【答案】C【考点解析】这题中,有多个赋值关系。从右到左计算,可以这样理解:首先a*a等于9,再计算a=a-9,得到a=-6,再计算a=a+(-6),所以最
14、后答案是-12。【例6】以下选项中,与k=n+完全等价的表达式是()。A.k=n,n=n+1B.n=n+1,k=nC.k=+n D.k+=n+1【答案】第4章程序设计三种基本结构41顺序结构注意事项:1表达式语句、空语句、复合语句2数据的输入与输出,输入输出函数的调用在C语言程序设计中并没有独立出来专用于输入、输出的语句,而是要调用系统提供的输入、输出函数来完成。scanf函数、printf函数参数意义 参数 意义 起始符号 指定输出对齐方式 赋值抑制符 0 指定空位是否填0m 域宽说明域 m.n 域宽及精度l/h 输入长度修正符 l/h 输出长度修正符3复合语句例题:一、选择题:【例1】下面
15、的程序的输出结果是()。#include<stdio.h>main( )int i=010,j=10;printf("%d,%d",+i,j-);A.11,10B.9,10C.010,9D.10,9【答案】B【例3】以下程序的输出结果是()。main( )int a=4,b=5,c=0,d;d=!a&&!b|!c;printf("%dn",d);A.1B.0C.非0的数 D.-1【答案】A【例6】若有以下程序main( )int k=2,i=2,m;m=(k+=i*=k);printf(“%d,%dn”,m,i);执行后的结果
16、是()。A.8,6B.8,3C.6,4D.7,4【答案】C【例13】设有以下程序段:int x=2002,y=2003;printf(“%dn”,(x,y);则结果是(2003 ).【例14】有以下程序main ( )intx=3,y=2,z=1;printf("%dn",x/y&z);程序运行后的输出结果是()。A.3B.2C.1D.0【答案】D【例18】有以下程序main ( )int m=3,n=4,x;x=-m+;x=x+8/+n;printf(“%dn”,x);程序运行后的输出结果是()。A.3B.5C.-1D.-2【答案】D【例22】有以下程序main
17、( )unsigned int a;int b=-1;a=b;printf(“%u”,a);程序运行后的输出结果是()。A.-1 B.65535C.32767D.-32768【答案】B【考点解析】在本题中,有一无符号变量和一整型变量,它们的值都是-1,在计算机整型的存储是以二进制存在,即是1000000000000001,输出函数的要求输出无符号a的值,即要把1000000000000001转化为十进制,得65535。二、填空题:【例24】以下程序的输出结果是_。main()int a=0;a+=(a=8);printf(“%dn”,a);【答案】16【考点解析】在程序是用printf函数输出
18、十进制的整数,表达式经过复合运算:a=a+a=8+8=16,则结果是16。【例25】以下程序的输出结果是_。main()int a=5,b=4,c=3,d;d=(a>b>c);printf(“%dn”,d);【答案】0【例27】以下程序运行后的输出结果是。main()int p=30;printf("%dn",(p/3>0?p/10:p%3);【答案】342选择结构 注意事项: 例题:一、选择题:【例1】有以下程序main()int a=15,b=21,m=0;switch(a%3) case 0:m+ ;break;case 1:m+;switch(b%
19、2)default:m+;case 0:m+;break; printf("%dn",m);程序运行后的输出结果是()。A.1B.2C.3D.4【答案】A【例3】有以下程序main()int i=1,j=1,k=2;if(j+|k+)&&i+)printf("%d,%d,%dn",i,j,k);执行后输出结果是()。A.1,1,2B.2,2,1C.2,2,2D.2,2,3【答案】C【考点解析】在本题中,先计算if语句后面表达式(j+|k+)&&i+,当j=j+1=2成立时,程序并不继续运行k+,即k=2,再运行i=i+1=
20、2,最后输出i、j、k的值分别是2,2,2。【例4】有以下程序main()int a=5,b=4,c=3,d=2;if(a>b>c)printf("%dn",d);elseif(c-1>=d)=1)printf("%dn",d+1);elseprintf("%dn",d+2);执行后输出结果是()。A.2 B.3C.4 D.编译时有错,无结果【答案】B【考点解析】在语言中if总是与离它最近的else语句配对。首先执行第一个if语句,判断表达式(a>b>c),”>”运算符为左结合性,即a>b&g
21、t;c的值为假,所以执行else后面的语句。而else后面语句又是if else语句,判断表达式(c-1>=d)=1),整个表达式成立,则执行输出d+1=3。【例12】有以下程序main()int n=0,m=1,x=2;if(!n)x-=1;if(m)x-=2;if(x)x-=3;printf("%dn",x);执行后输出结果是。【答案】-4【考点解析】在本题中,是多个if构成的选择结构。!n=!0为真执行x=x-1=2-1=1,m1,而m又为真,执行x=x-2=1-2=-1,再x的值为真,执行x=x-3=-1-3=-4。43循环结构 注意事项:1for循环结构fo
22、r(表达式1;表达式2;表达3)语句;2while和do while循环结构do while语句至少执行一次。3continue语句与break语句Continue语句是用于循环语句中,当执行到该语句时,重新跳到循环语句的开始位置继续执行程序。而break语句则是跳出循环语句,执行循环体外的语句。4循环的嵌套 例题一、选择题:【例1】以下程序中,while循环的循环次数是()。main()int i=0;while(i<10)if(i<1) continue;if(i=5)break;i+;A.1 B.10C.6 D.死循环,不能确定次数【答案】D【考点解析】在题目中,首先给整型变
23、量i赋初始值为0,接着进行循环语句while判断,判断为真则进入循环体,在循环体中执行选择结构的if语句,这里有两个if语句,第一个if成立,则执行重新回到while语句重新判断,因为变量i的值没有发生改变,则程序会一直在这两条语句间执行,而造成死循环。【例2】以下程序的输出结果是()。main()int a=0,ifor(i=1;i<5;i+)switch(i)case 0:case 3:a+=2;case 1:case 2:a+=3;default:a+=5;printf("%dn ",a);A.31B.13C.10D.20【答案】A【考点解析】当i为1时,a=a
24、+3+5=8;当i=2时,a=a+3+5=16;当i=3时,a=a+2+3+5=26;其余的为a=a+5=31,即答案为31。【例3】以下程序的输出结果是()。#include <stdio.h>main()int i=0,a=0;while(i<20)for(;)if(i%10)=0) break;else i-;i+=11;a+=i; printf("%dn",a);A.21B.32C.33D.11【答案】B【例5】有以下程序main()int i=0,s=0;doif(i%2)i+;continue; i+;s+=i; while(i<7);p
25、rintf("%dn",s);执行后输出结果是A.16B.12C.28D.21【答案】A【例7】有以下程序main()int k=4,n=0;for(;n<k;)n+;if(n%3!=0)continue;k-;printf(“%d,%dn”,k,n);程序运行后的输出结果是()。A.1,1B.2,2 C.3,3D.4,4【答案】C【例12】有以下程序main()int i,n=0;for(i=2;i<5;i+)doif(i%3) continue;n+;while(!i);n+;printf("n=%dn",n);程序执行后的输出结果是()
26、。A.n=5B.n=2C.n=3D.n=4【答案】D第5章 数组与函数51数组 数组是一个有序的数据集合,数组里每个元素都属于同一个数据类型,用一个统一的数组名和下标来确定数组中的元素。注意事项: 1.一维数组的定义、初始化和引用(1)一维数组的定义方式:类型标识符 数组名 数组长度数组名命名规则和标识符命名规则一致。(2)一维数组的初始化方法:在定义数组时对数组初始化,如:int array8=1,2,3,4,5,6,7,8可以只给一部分元素赋值,如:int array8=1,2,3,4 即:int array8=1,2,3,4,0,0,0,0若要数组里所有元素为0,可以写成:int arr
27、ay8=0在对数组中全部元素赋初值时,可以不指定数组长度,如:int array =1,2,3,4,5与int array5=1,2,3,4,5意义相同。(3)一维数组的引用:数组名 下标2.多维数组的定义、初始化和引用3.字符数组的定义、初始化和引用char 数组名数组长度4.字符串在C语言中字符串是作为字符数组来处理。系统对字符串常量自动加入一个'0'作为结束符。例如"hello world"共有11个字符,但在内存中占有12个字节的空间,第十二个字符为'0'又系统自动加上去的。例题一、选择题【例1】若已定义:int a =0,1,2,3
28、,4,5,6,7,8,9, *p=a,i;中 0i9, 则对a数组元素不正确的引用是()。A.ap-aB.*(&ai)C.pi D.a10【答案】D【例2】下列程序执行后的输出结果是( )。main()char arr10;strcpy(arr,"your"); strcat(arr,"me");arr3='&'printf("%s n",arr);A.you&meB.youC.meD.err【答案】A【例3】当执行下面的程序时,如果输入ABC,则输出结果是()。#include "s
29、tdio.h"#include "string.h"main() char ss10="1,2,3,4,5"gets(ss); strcat(ss, "6789"); printf("%sn",ss);A.ABC6789B.ABC67C.12345ABC6D.ABC456789【答案】A【考点解析】gets( )函数的从终端输入一个字符串到字符数组,题目输入ABC后数组ss内容为"ABC0",strcat()作用是在数组ss后面连接上字符串"6789",所以答案选A
30、。【例6】以下程序的输出结果是()。main()int i,x33=1,2,3,4,5,6,7,8,9;for(i=0;i<3;i+) printf("%d,",xi2-i);A.1,5,9B.1,4,7C.3,5,7D.3,6,9【答案】C【考点解析】题目输出的是x02、x11和x20。【例7】以下程序的输出结果是()。main() int a33=1,2,3,4,5,6,i,j,s=0;for(i=1;i<3;i+) for(j=0;j<=i;j+)s+=aij;printf("%dn",s);A.18 B.19C.20D.21【答
31、案】A【考点解析】初始化时只把数组里部分元素赋值,没有赋值的默认为0,题目把a10、a11、a20、a21和a22累加到s。【例8】(2001年4月)以下程序的输出结果是()。main() char w 10="ABCD","EFGH","IJKL","MNOP",k;for(k=1;k<3;k+)printf("%sn",wk);A.ABCD B. ABCD FGH EFG KL IJ MC.EFG D. EFGH JK IJKL O【答案】D【考点解析】题目输出的是w1和w2。【例11
32、】以下程序中函数sort的功能是对a所指数组中的数据进行由大到小的排序void sort(int a,int n) int i,j,t;for(i=0;i<n-1;i+)for(j=i+1,j<n;j+)if(ai<aj)t=ai;ai=aj;aj=t;main() int aa10=1,2,3,4,5,6,7,8,9,10,i;sort(&aa3,5);for(i=0;i<10;i+)printf("%d,",aai);printf("n");程序运行后的输出结果是()。A.1,2,3,4,5,6,7,8,9,10B.
33、10,9,8,7,6,5,4,3,2,1,C.1,2,3,8,.9,10 D. 1,2,10,9,8,7,6,5,4,3【答案】C【考点解析】题中sort(&aa3,5)把数组aa中的第四个元素的地址传递给形式参数,利用sort函数把数组中第4至8进行排序,所以正确答案选C。【例12】以下程序中函数reverse的功能是将a所指数组中的内容进行逆置void reverse(int a ,int n) int i,t;for(i=0;i<n/2;i+)t=ai; ai=an-1-i;an-1-i=t; main() int b10=1,2,3,4,5,6,7,8,9,
34、10; int i,s=0;reverse(b,8);for(i=6;i<10;i+) s+=bi;printf("%dn",s);程序运行后的输出结果是()。A.22B.10C.34D.30【答案】A【考点解析】通过reverse把数组b前8个元素逆置为8,7,6,5,4,3,2,1,再对数组b最后4 个元素求和。【例5】以下程序运行后的输出结果是。main() int a44=1,2,3,4,5,6,7,8,11,12,13,14,15,16,17,18;inti=0,j=0,s=0;while(i+<4)if(i=2|i=4) continue; j=0;
35、do s+= aij; j+; while(j<4);printf("%dn",s);【答案】92【考点解析】题目中两个循环语句,第一个while语句的条件是i+<4,先进行了自增1在判断是否符合循环条件,所以在while循环体内i的初值是1,当i为2或4时回到循环的开头,所以在do while循环体内i的值只能是1和3,所以s=a10 +a11+a12+a13+a30+a31+a32+a33=92。42函数函数是组成C程序的基本单位,一个C程序可由一个主函数和若干个子函数组成,每个子函数可以完成特定的功能。注意事项:1库函数的正确调用2函数的定义方法函数定义的
36、一般形式:类型标识符 函数名(形式参数列表)数据声明部分语句3局部变量和全局变量。4变量的存储类别(自动、静态、寄存器、外部),变量的作用域和生存期。变量的存储类别,是指变量在内存中的存储方式。可以分为:自动(auto)、静态(static)、寄存器(register)、外部(extern)四个类型。自动(auto):这种类型的变量是动态分配存储空间的,数据存放在动态存储区中。函数的形式参数和函数体内的形式参数都属于这种类型。在函数调用时分配存储空间,当调用结束就释放存储空间。静态(static):这种类型的变量占用着存储空间不释放,在下次访问该变量时,该变量的值是上次修改的值。寄存器(reg
37、ister):这种存储方式跟自动(auto)方式都是相同,当使用完变量以后会自动释放空间。外部(extern):这种类型的变量就是全局变量.变量的作用域是指变量能够发挥作用的范围.变量的生存期是指变量在程序执行的过程中存在、拥有分配的存储空间的时期。例题一、选择题【例3】下列程序执行后的输出结果是()。void func1(int i);void func2(int i);char st="hello,friend!"void func1(int i) printf("%c",sti); if(i<3)i+=2;func2(i);void func
38、2(int i) printf("%c",sti); if(i<3)i+=2;func1(i);main()int i=0;func1(i); printf("n");A.helloB.helC.hloD.hlm【答案】C【考点解析】这道题中两个函数里面都发生了嵌套调用,过程如下,i=0,调用func1(0)函数输出st0,i=2,调用func2(2)输出st2,i=4,调用func1(4)输出st4。【例4】有如下函数调用语句func(rec1,rec2+rec3,(rec4,rec5);该函数调用语句中,含有的实参个数是()。A.3B.4C.5
39、D.有语法错【答案】A【例6】有如下程序long fib(int n) if(n>2) return(fib(n-1)+fib(n-2);else return(2);main() printf("%dn",fib(3); 该程序的输出结果是()。A.2B.4C.6D.8【答案】B【考点解析】题目中fib(3)=fib(2)+fib(1)=2+2=4。【例7】在C语言中,函数的隐含存储类别是()。A.auto B.staticC.externD.无存储类别【答案】C【例8】有以下函数char fun(char *p) return p; 该函数的返回值是( )。A.无
40、确切的值。 B.形参p中存放的地址值。C.一个临时存储单元的地址。D.形参p自身的地址值。【答案】B【考点解析】题目中,p是一个字符型指针作为形式参数,在调用函数的时候存放实际参数的地址,所以返回是返回p中存放的地址而不是p自身的地址。【例10】当调用函数时,实参是一个数组名,则向函数传送的是()。A.数组的长度。 B.数组的首地址。C.数组每一个元素的地址。D.数组每个元素中的值。【答案】B【例11】以下只有在使用时才为该类型变量分配内存的存储类说明是()。A.auto和 static B. auto和 registerC. register和 static D.extern和 regist
41、er【答案】B【例13】在调用函数时,如果实参是简单变量,它与对应形参之间的数据传递方式是()。A.地址传递。 B.单向值传递。C.由实参传给形参,再由形参传回实参。D.传递方式由用户指定。【答案】B【考点解析】在C语言中,函数的传递方式只有单向值传递。【例17】在C语言中,形参的缺省存储类别是()。A.autoB.registerC.static D.extern【答案】A【例18】以下叙述中正确的是()。A. 全局变量的作用域一定比局部变量的作用域范围大。B.静态(static)类别变量的生存期贯穿于整个程序的运行期间。C.函数的形参都属于全局变量。D.未在定义语句中赋初值的auto变量和
42、static变量的初值都是随机值。【答案】B【例19】若已定义的函数有返回值,则以关于该函数调用的叙述中错误的是()。A.调用可以作为独立的语句存在。 B.调用可以作为一个函数的实参。C.调用可以出现在表达式中。D.调用可以作为一个函数的形参。【答案】D【考点解析】调用函数有三种方式:作为独立语句、作为一个函数的实际参数和在表达式中参加运算。第6章指针注意事项:1指针与指针变量的概念,指针与地址运算符。(1)指针与指针变量的概念。C语言中的指针是指一个变量的地址,存放这个地址的变量就是指针变量。指针变量跟普通变量占用一定的存储空间,不同的是存储在指针变量存储空间中的不是普通数据而是一个地址。当
43、指针得到某一地址时,称指针指向该存储区域。可以通过指针对它所指向的内存区域中的数据进行处理。指针所指向的内存区域中的数据称为指针的目标,指针目标用指针名前面加*符号表示。(2)指针与地址运算符。C语言中与指针有关的运算符有两个:&:取地址运算符,例如:&a表示变量a的地址。*:指针运算符,例如:*p表示p所指向的变量。2变量、数组、字符串、函数、结构体的指针以及指向变量、数组、字符串、函数、结构体的指针变量。通过指针引用以上各类型数据。(1)指针的声明形式:数据类型 * 指针名 (2)数组与指针。C语言中的指针可以指向数组元素,同时可以通过指针引用数组,通过指针引用数组能提高程
44、序的质量。定义指向数组元素的指针变量形式与定义指向变量的指针变量相同,如:int a10;int *p;p=&a0;或p= a;p的初值为&a0,则:p+i和a+i就是ai的地址。*(p+i)或*(a+i)是p+i或a+i所指向的数组元素ai。指向指针的变量也可以带下标,如pi和*(p+i)等价。(3)字符串与指针。(4)指向函数的指针。数据类型 (*指针名)( )这里的数据类型是指函数的返回类型。3用指针作函数参数。用指针作为函数参数可以实现“传址”方式的参数传递,使得主调用函数得到多个在被调用函数处理过程中所修改了的值。4返回指针值的指针函数。函数的返回值可以是指针,这种函
45、数的定义形式如下:数据类型 *函数名(参数表)这里数据类型是指返回指针的数据类型。5指针数组,指向指针的指针,main函数的命令行参数。(1)指针数组。指针数组是一个数组,数组里面每个元素都是一个指针变量,其定义形式如下:数据类型 *数组名数组长度与二维字符数组相比指针数组用于处理多个字符串更方便。如果用二维字符数组来处理多个字符串时,数组的列数是相同的,但并不能保证每个字符串的长度都相同,这样就会造成存储空间的浪费,而用字符型的指针数组处理多个字符串就不存在这样的问题,因为并不需要规定字符串的长度。(2)指向指针的指针。当一个指针变量指向另一个指针是,称该指针变量为指向指针的指针变量,简称指
46、向指针的指针。定义一个指向指针的指针一般形式如下:数据类型 *指针名(3)main函数的命令行参数。指针数组的一个重要的应用是作为main函数的形式参数。main函数带参数的形式如下:main(int argc,char *argv )这两个形参的值不能从程序中得到,而是和命令一起给出。用带形参的main函数可以直接从命令行得到参数值,在程序运行时可以根据输入的命令进行不同的处理。利用带形参的main函数增加了一条系统向程序传递数据的途径。例题一、选择题【例1】下列程序执行后的输出结果是()。void func(int *a,int b)b0=*a+6;main() int a,b5; a=0
47、; b0=3; func(&a,b); printf("%dn",b0);A.6 B.7 C.8 D.9【答案】A【考点解析】题中func函数的两个形式参数分别为指针和数组,分别接受一个地址和一个数组名作为实际参数。实际参数&a把a的地址传递给形式参数使形参指向变量a,所以函数中*a是a的值0,数组作为函数实际参数时传递给函数的是数组的首地址,数组元素在函数中的修改会影响到函数外的值。【例2】下列程序执行后的输出结果是()。main()int a33, *p,i; p=&a00; for(i=0; i<9; i+)pi=i+1;printf("%dn",a12);A.3 B.6 C.9 D.随机数【答案】B【考点解析】a12是数组a的第2行第3个元素,即p5=6。 【例6】设已有定义: char *st="how are you",下列程序段中正确的是()。A.char a11,*p; strcpy(p=a+1,&st4);B. char a11; strcpy(+a, st);C.char a11; strcpy(a, st);D.char a ,*p;strcpy(p=&a1,st+2);【答案】A【考点解析】A选项是把st所指向的字符串
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
评论
0/150
提交评论