2级C912章doc.docx
- 文档编号:25710716
- 上传时间:2023-06-11
- 格式:DOCX
- 页数:60
- 大小:46.65KB
2级C912章doc.docx
《2级C912章doc.docx》由会员分享,可在线阅读,更多相关《2级C912章doc.docx(60页珍藏版)》请在冰豆网上搜索。
2级C912章doc
第9章指针
9.1关于地址和指针(考核分值0.055,考核概率9.4%)
在C语言中,将地址形象地称为指针。
一个变量的地址称为变量的指针,一个专门用来存放另一个变量的地址的变量(即指针),则称它为指针变量。
9.2变量的指针和指向变量的指针变量
9.2.1指针变量的定义
定义指针变量的一般形式:
类型名*指针变量名1,*指针变量名2,。
。
。
;
例如:
int*p,*t;
9.2.2指针变量的引用
指针变量只能存放地址,与指针相关的两个运算符是&(取地址运算)和*(指针运算符)。
9.2.3指针变量作为函数参数
指针类型数据可以作为函数参数来进行传递。
作用:
将一个变量的地址传送到另一个函数中,参与该函数的运算。
形参指针变量的值的改变不能使实参指针变量的值发生改变。
相关试题:
◆
(1)以下叙述中正确的是
A如果p是指针变量,则&p是不合法的表达式
B如果p是指针变量,则*p表示变量P的地址值
C在对指针进行加、减算术运算时,数字1表示1个存储单元的长度
D如果p是指针变量,*p+1和*(p+1)的效果是一样的
◆
(2)以下叙述中正确的是
A基类型不同的指针变量可以相互混用
B函数的类型不能是指针类型
C函数的形参类型不能是指针类型
D设有指针变量为double*p,则p+1将指针移动8个字节
◆(3)如果定义floata[10],x;则以下叙述中正确的是:
A语句a=&x;是非法的
B表达式a+1是非法的
C三个表达式a[1]、*(a+1)、*&a[1]表示的意思完全不同
D表达式*&a[1]是非法的,应该写成*(&(a[1]))
◆(4)以下叙述中正确的是:
Aint*p1;int**p2;int*p3;都是合法的定义指针变量的语句
B指针变量只能通过求地址运算符(&)来获得地址值
C语句p=NULL;与p=\0;是等价的语句
D语句p=NULL;执行后,指针p指向地址为0的存储单元
◆(5)以下叙述中正确的是
A即使不进行强制类型转换,在进行指针赋值运算时,指针变量的基类型也可以不同
B如果企图通过一个空指针来访问一个存储单元,将会得到一个出错信息
C设变量p是一个指针变量,则语句p=0;是非法的,应该是用p=NULL;
D指针变量之间不能用关系运算符进行比较
◆(6)若有以下程序
#include
int*f(int*s,int*t)
{int*k;
if(*s<*t){k=s;s=t;t=k;}
returns;
}
main()
{inti=3,j=5,*p=&i,*q=&j,*r;
r=f(p,q);printf(“%d,%d,%d,%d,%d\n”,i,j,*p,*q,*r);
}
程序的输出结果是
A3,5,5,3,5B3,5,3,5,5C5,3,5,3,5D5,3,3,5,5
◆(7)设有定义intx=0,*p;紧接着的赋值语句正确的是
A*p=NULL;Bp=NULL;Cp=x;D*p=x;
◆(8)设p是指针变量,语句p=NULL;等价于
Ap=’0’;Bp=’’;Cp=””;Dp=0;
◆(9)若有以下程序
#include
main()
{inta[]={10,20,30,40,},*p=a,i;
for(i=0;i<3;i++)
{a[i]=*p;p++;}
printf(“%d\n”,a[2]);
}
程序的输出结果是
A10B20C30D40
◆(10)若有以下程序
#include
voidsp(int*a)
{intb=2;
a=&b;*a=*a*2;printf(”%d,”,*a);
}
main()
{intk=3,*p=&k;
sp(p);
printf(“%d,%d\n”,k,*p);
}
程序的输出结果是
A4,3,3B4,3,4C6,3,6D6,6,6
◆(11)以下选项中函数形参不是指针的是
Afun(int*a){…}
Bfun(inta[10]){…}
Cfun(int&p){…}
Dfun(intp[]){…}
◆(12)若有以下程序
#include
main()
{inty=1,x,a[]={2,4,6,8,19},*p;
p=&a[1];
for(x=0;x<3;x++)y=y+*(p+x);
printf(“%d\n”,y);
}
程序的输出结果是
A17B19C18D20
◆(13)以下程序调用fun函数求数组中最大值所在元素的下标。
#include
voidfun(int*s,intn,int*k)
{inti;
for(i=0,*k=i;i if(s[i]>s[*k]); } main() {inta[5]={1,6,2,8,0},k; fun(a,5,&k); printf(“%d%d\n”,k,a[k]); } 在横线处应填入的内容是 A*k=iBk=iC*k=i-sDk=i-s ◆(14)若有以下程序 #include voidfun(char*p,intn) {charb[6]=”abcde”;inti; for(i=0,p=b;i } main() {chara[6]=”ABCDE”; fun(a,5);printf(“%s\n”,a); } 程序的输出结果是 AabcdeBABCDECedcbaDedcba ◆(15)以下fun函数返回数组中最大值的下标 #include intfun(char*s,intn) {inti,k; for(i=0,k=i;i if(s[i]>s[k]); return(k); } 在横线处应填入的内容是 A++kBi=kCk++Dk=i ◆(16)有以下程序 #include voidfun(intx,inty,int*c,int*d) {*c=x+y; *d=x-y; } main() {inta=4,b=3,c=0,d=0; fun(a,b,&c,&d); printf(“%d%d\n”,c,d); } 程序的输出结果是 A00B43C34D71 ◆(17)有以下程序 #include voidfun(int*p,int*q) {intt; t=*p; *p=*q; *q=t; *q=*p; } main() {inta=0,b=9; fun(&a,&b); printf(“%d%d\n”,a,b); } 程序的输出结果是 A90B00C99D09 程序填空题 (1)整除和求余 下列给定程序中,函数fun的功能是: 把形参s所指字符串中下标为奇数的字符右移到下一个奇数位置,最右边被移出字符串的字符绕回放到第一个奇数位置,下标为偶数的字符不动(注: 字符串的长度大于等于2)。 例如,形参s所指字符串为"abcdefgh",执行结果为"ahcbedgf"。 请在下画线处填入正确的内容并将下画线删除,使程序得出正确的结果。 注意: 部分源程序在文件BLANK1.C中。 不得增行或删行,也不得更改程序的结构! #include voidfun(char*s) {inti,n,k;charc; n=0; for(i=0;s[i]! ='\0';i++)n++; /**********found**********/ if(n%2==0)k=n-___1___; elsek=n-2; /**********found**********/ c=___2___; for(i=k-2;i>=1;i=i-2)s[i+2]=s[i]; /**********found**********/ s[1]=___3___; } main() {chars[80]="abcdefgh"; printf("\nTheoriginalstringis: %s\n",s); fun(s); printf("\nTheresultis: %s\n",s); } 【参考答案】 (1)1 (2)s[k]或*(s+k) (3)c 【考点分析】 本题考查: 指针型变量;if…else语句;赋值语句。 程序修改题 (1)赋值出错 下列给定程序中函数fun的功能是: 将p所指字符串中的所有字符复制到b中,要求每复制三个字符之后插入一个空格。 例如,若给a输入字符串: ABCDEFGKHIJK,调用函数后,字符数组b中的内容为: ABC DEF GHI JK。 请改正程序中的错误,使它能得出正确结果。 注意: 部分源程序在文件MODI1.C中,不得增行或删行,也不得更改程序的结构 #include voidfun(char*p,char*b) {inti,k=0; while(*p) {i=1; while(i<=3&&*p){ /**********found**********/ b[k]=p; k++;p++;i++; } if(*p) { /**********found**********/ b[k++]=""; } } b[k]='\0'; } main() {chara[80],b[80]; printf("Enterastring: ");gets(a); printf("Theoriginalstring: ");puts(a); fun(a,b); printf("\nThestringafterinsertspace: ");puts(b);printf("\n\n"); } 【参考答案】 (1)b[k]=*p; (2)b[k]='';k++; 【考点分析】 本题考查: 指针类型变量作为函数的参数,函数的参数不仅可以是整型、实型、字符型等数据类型,还可以是指针类型。 它的作用是将一个变量的地址传送到另一个函数中。 9.3数组与指针(考核分值0.531,考核概率43.8%) 9.3.1指向数组元素的指针 C语言规定数组名代表数组的首地址,也就是数组中第0号元素的地址。 定义指向数组元素的指针变量的方法,与定义指向变量的指针变量相同。 9.3.2通过指针引用数组元素 如果指针变量p已指向数组中的一个元素,则p+1指向同一数组中的下一个元素。 9.3.3用数组名作为函数参数 当数组名作为参数被传递时,若形参数组中各元素发生了变化,则原实参数组的值也随之变化。 如果有数组元素作为实参,情况就与用变量作为实参时一样,是“值传递”方式。 9.3.4指向多维数组的指针和指针变量 多维数组可以看做是一维数组的延伸,多维数组的内存单元也是连续的内存单元。 C语言实际上是把多维数组当成一维数组来处理的。 相关试题: ◆ (1)有以下程序 #include #include voidfun(int*p1,int*p2,int*s) {s=(int*)malloc(sizeof(int)); *s=*p1+*(p2+1); } main() {inta[2]={1,2},b[2]={10,20},*s=a; fun(a,b,s);printf(“%d\n”,*s); } 程序的输出结果是 A11B10C1D2 ◆ (2)有以下程序 #include #include voidfun(double*p1,double*p2,double*s) {s=(double*)calloc(1,sizeof(double)); *s=*p1+*(p2+1); } main() {doublea[2]={1.1,2.2},b[2]={10.0,20.0},*s=a; fun(a,b,s); printf(“%5.2f\n”,*s); } 程序的输出结果是 A21.10B11.10C12.10D1.10 /*calloc函数: 在内存的动态存储区中分配n个长度为size的连续空间,函数返回一个指向分配起始地址的指针;如果分配不成功,返回NULL。 跟malloc的区别: calloc在动态分配完内存后,自动初始化该内存空间为零,而malloc不初始化,里边数据是随机的垃圾数据。 */ (3)有以下程序 #include #include voidfun(int*p1,int*p2,int*s) {s=(int*)calloc(1,sizeof(int)); *s=*p1+*p2; free(s); } main() {inta[2]={1,2},b[2]={40,50},*q=a; fun(a,b,q);printf(“%d\n”,*q); } 程序的输出结果是 A42B41C1D0 ◆(4)有以下程序 #include strcutSTU{charname[9];charsex;intscore[2];} voidf(strcutSTUa[]) {strcutSTUb={“Zhao”,’m’,85,90}; a[1]=b; } main() {strcutSTUc[2]={{“Qian”,’f’,95,92},{“Sun”,’m’,98,99}}; f(C); printf(“%s,%c,%d,%d,”,c[0].name,c[0].sex,c[0].score[0],c[0].score[1]); printf(“%s,%c,%d,%d,”,c[1].name,c[1].sex,c[1].score[0],c[1].score[1]); } 程序的输出结果是 AQian,f,95,92,Sun,m,98,99 BQian,f,95,92Zhao,m,85,90 CZhao,m,85,90,Sun,m,98,99 DZhao,m,85,90,Qian,f,95,92 9.4字符串与指针(考核分值1.213,考核概率75%) 9.4.1字符串的表示形式 用字符数组存放一个字符串,然后输出该字符串。 用字符指针指向一个字符串。 用字符指针指向字符串中的字符。 9.4.2字符串指针作函数参数 将一个字符串从一个函数传递到另一个函数,可以用地址传递的办法,即用字符数组名作为参数或用指向字符串的指针变量作为参数,进行传递。 9.4.3字符指针变量和字符数组的区别 字符数组是由若干个元素组成的,每个元素存放一个字符,而字符指针变量中存放的是地址,绝不是将字符串的内容存放到字符指针变量中。 赋值方式不同: 字符数组可以在定义时对其整体赋初值,但在赋值语句中不能完成整体赋值。 而字符指针变量既可以在定义时赋初值,也可以在赋值语句中完成。 编译时不同: 在程序中指针变量的值可以改变。 而数组名虽然代表了地址,但它的值是一个固定的值,不能改变。 相关试题: ◆ (1)有以下程序 #include voidfun(char**p) {inti; for(i=0;i<4;i++) printf(“%s”,p[i];); } main() {char*s[6]={“ABCD”,”EFGH”,”IJKL”,”MNOP”,”QRST”,”UVWX”}; fun(s);printf(“\n”); } 程序的输出结果是 AABCDEFGHIJKL BABCD CAEIM DABCDEFGHIJKLMNOP ◆ (2)有以下程序 #include Intfun(chars[]) {char*p=s; while(*p! =0)p++; return(p-s); } main() {printf(“%d\n”,fun(“0ABCDEF”)); } 程序的输出结果是 A1B6C7D0 (3)有以下程序 #include #include voidfun(char*s) {chara[10]; strcpy(a,”STRING”); s=a; } main() {char*p=”PROGRAM”; fun(p); printf(“%s\n’,p); } 程序的输出结果是(□代表空格) ASTRINGBSTRING□□□□CSTRING□□□DPROGRAM [新](4)有以下程序: #include #include char*a=”you”; char*b=”WelcomeyoutoBeijing! ”; main() {char*p; p=b; while(*p! =*a)p++; p+=strlen(a)+1; printf(“%s\n”,p); } 程序运行后的输出结果是: AtoBeijing! ByoutiBeijing! CWelcomeyoutoBeijing! DBeijing! 9.5指向函数的指针(考核分值0.088,考核概率12.5%) 指针变量可以指向一个函数,编译时,一个函数将被分配给一个入口地址,这个入口地址就称为该函数的指针。 因此,可以通过使用一个指向函数的指针变量调用此函数。 说明: 指向函数的指针变量的一般定义形式为: 数据类型(*指针变量名)(); 在给函数指针变量赋初值时,只需给出函数名而不必给出参数。 用函数指针变量调用函数时,只需将(*s)代替函数名即可(s为已经定义过的指向函数的指针变量名),在(*s)之后的括号中根据需要写上实参。 对指向函数的指针变量,有些运算,如++s、——s、s+3等,都是没有意义的。 相关试题: ◆设有某函数的说明为: int*func(inta[10],intn);则下列叙述中正确的是 A形参a对应的实参只能是数组名 B说明中的a[10]写成a[]或者*a效果完全一样 Cfunc的函数体中不能对a进行移动指针(如a++)的操作 D只有指向10个整数内存单元的指针,才能作为实参传给a 9.6指针数组和指向指针的指针(考核分值0.091,考核概率15.6%) 9.6.1指针数组的概念 若在一个数组中,其元素均为指针类型数据,这样的数组成为指针数组。 9.6.2指向指针的指针 指向指针数据的指针变量,简称为指向指针的指针,通常成为二级指针。 定义一个指向指针数据的指针变量的形式: 类型名**a。 相关试题: ◆ (1)若有以下程序 #include intk=7; voidf(int**s) {int*t=&k; *s=t; printf(“%d,%d,%d,”,k,*t,**s); } main() {inti=3, *p=&i, **r=&p; f(r); printf(“%d,%d,%d\n”,i,*p,**r); } 程序的输出结果是 A3,3,3,3,7,7,7B3,7,7,7,7,7C7,7,7,3,3,3D7,7,7,3,7,7 (2)若有以下程序 #include intk=7,m=5; voidf(int**s) {int*t=&k; s=&t; *s=&m; printf(“%d,%d,%d,”,k,*t,**s); } main() {inti=3,*p=&i,**r=&p; f(r);printf(“%d,%d,%d\n”i,*p,**r); } 程序的输出结果是 A7,5,7,3,5,7B7,5,7,3,3,3C7,5,5,3,3,3,D7,7,5,3,3,3, [新](3)有以下程序: #include main() {intx[3][4]={1,3,5,7,9,11,2,4,6,8,10,12}; int(*p)[4]=x,k=1,m,n=0; for(m=0;m<2;m++)n+=*(*(p+m)+k); printf(“%d\n”,n); } A14 B20 C10 D16 第10章编译预处理和动态存储分配 10.1宏定义(考核分值0.803,考核概率75%) 10.1.1不带参数的宏定义 (1)定义形式: #define宏名替换文本或者#define宏名 (2)说明: 在define宏名和宏替换文本之间要用空格隔开。 可以用#undef命令禁止宏定义的作用域。 在进行宏定义时,可以引用已定义的宏名。 宏定义只是做个简单的替换,同一个宏名不能重复定义。 10.1.2带参数的宏定义 (1)定义形式: #define宏名(参数表)字符串 宏定义不只进行简单的字符串替换,还可以进行参数替换。 (2)执行过程: 如果程序中有带有实参的宏,则按#define命令行中指定的字符串从左到右进行置换。 如果字符串中包含宏中的形参(如x,y),则将程序语句中相应的实参(可以是常量、变量或表达式)代表形参。 如果宏定义中的字符串中的字符不是参数字符(如(x*y)中的*号),则保留。 这样就形成了置换的字符串。 相关试题: (1)若有以下程序 #include #defineN3 voidfun(inta[][N],intb[]) {inti,j;
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- C912 doc
![提示](https://static.bdocx.com/images/bang_tan.gif)