第8章 指针
- 格式:docx
- 大小:23.96 KB
- 文档页数:4
1.以下定义语句中正确的是A) int a=b=0; B) char A=65+1,b='b';C) float a=1,*b=&a,*c=&b; D) double a=0.0; b=1.1;参考答案:B【解析】A选项语句中b变量还没有定义不能直接用于给a变量赋值。C选项语句中*b、*c表示的是一个实型变量的地址,不能再将&b赋值给指针型变量c。D选项语句中a=0.0后面应该为逗号,不能是分号。2.有以下程序#include <stdio.h>void f(int *p,int *q);main(){ int m=1,n=2,*r=&m;f(r, &n);printf("%d,%d",m,n);}void f(int *p,int *q){ p=p+1;*q=*q+1;}程序运行后的输出结果是A) 2,3 B) 1,3 C) 1,4 D) 1,2参考答案:B【解析】在f(int *p,int*q)函数中,执行p=p+1是将p所对应的地址加1,而*q=*q+1是将q所指向的n的地址所对应的值加1,所以m的得知所对应的值没有变,而n的值则为3了。
因此B选项正确。
3.以下叙述中正确的是A) 如果p是指针变量,则&p是不合法的表达式B) 如果p是指针变量,则*p表示变量p的地址值C) 在对指针进行加、减算术运算时,数字1表示1个存储单元的长度D) 如果p是指针变量,则*p+1和*(p+1)的效果是一样的参考答案:C【解析】B选项中,如果p是指针变量,则*p表示变量p所指向的地址的值;A选项中,如果p是指针变量,则&p表示变量p的地址;D选项中,如果p是指针变量,*p+1表示将p所指的值加上1,而*(p+1)表示的是先将指针右移一位再取所指向变量的值。
因此C选项正确。
4.以下叙述中正确的是A) 基类型不同的指针变量可以相互混用B) 函数的类型不能是指针类型C) 函数的形参类型不能是指针类型D) 设有指针变量为double *p,则p+1 将指针p移动8个字节参考答案:D【解析】B选项中,所谓函数类型是指函数返回值的类型。
实验十一:练习使用多用电表,◎注意事项1.多用电表使用注意事项(1)使用前要机械调零。
(2)两表笔在使用时,电流总是“红入”“黑出”。
(3)测电阻时①指针指中值附近较准,否则换挡。
②每换一挡必须重新欧姆调零。
③读出示数要乘以倍率。
(4)使用完毕,选择开关置于“OFF”挡或交流电压最高挡,长期不用应取出电池。
2.电路故障检测注意事项将多用电表拨到直流电压挡作为电压表使用。
在电源完好时,将电压表与外电路的各部分电路并联。
若电压表示数等于电源电动势,则说明该部分电路中有断点。
◎误差分析1.偶然误差(1)估读时易带来误差。
(2)表头指针偏转过大或过小都会使误差增大。
2.系统误差(1)电池用旧后,电动势会减小,内阻会变大,致使电阻测量值偏大,要及时更换电池。
(2)测电流、电压时,由于电表内阻的影响,测得的电流、电压值均小于真实值。
考点一多用电表的原理、读数及使用欧姆表刻度盘的特点1.左∞右0:电阻无限大刻度线与电流、电压挡零刻度线重合,电阻零刻度线与电流、电压挡最大刻度线重合。
2.刻度不均匀:左密右疏。
3.欧姆挡是倍率挡:即读出的示数应再乘以该挡的倍率;电流、电压挡是量程范围挡,在不知道待测电阻的估计值时,应先从小倍率开始,熟记“小倍率小角度偏,大倍率大角度偏”。
(1)用多用电表的欧姆挡测量阻值为几十千欧的电阻R x,以下给出最可能的实验操作步骤,其中①为选择开关,②为欧姆调零旋钮.把你认为正确的步骤前的字母按合理的顺序填写在横线上:________。
a.将两表笔短接,调节②使指针对准刻度盘上欧姆挡的0刻度,断开两表笔b.将两表笔分别连接到被测电阻的两端,读出R x的阻值后,断开两表笔c.旋转①使其尖端对准欧姆挡“×1 k”d.旋转①使其尖端对准欧姆挡“×100”e.旋转①使其尖端对准交流500 V挡,并拔出两表笔根据如图所示指针位置,此时被测电阻的阻值约为________Ω。
(2)下列关于用多用电表欧姆挡测电阻的说法中正确的是________(填选项前的字母)。
1、int *p 的含义是(B)A.p是一个指针, 用来存放一个整型数B.p是一个指针, 用来存放一个整型数据在内存中的地址C.p是一个整型变量D. 以上都不对2、以下函数用来求出两整数之和,并通过形参将结果传回,请填空。
void func(int x,int y, ___int*____ z){ *z=x+y; }3、有如下程序段(B)int *p,a=10,b=1;p=&a; a=*p + b;执行该程序段后,a的值是A. 12B. 11C. 10D. 编译出错4、若己定义:int a[9],*p=a;并在以后的语句中未改变p的值,不能表示a[1]地址的表达式是( C)A) p+1B) a+1C) a++D) ++p5、以下程序运行后的输出结果是(A)void main( ){ int a[ ]={1,2,3,4,5,6,7,8,9,0},*p;for(p=a;p<a+10;p++) printf("%d,",*p);}A)1,2,3,4,5,6,7,8,9,0,B)2,3,4,5,6,7,8,9,10,1,C)0,1,2,3,4,5,6,7,8,9,D)1,1,1,1,1,1,1,1,1,1,6、下面程序的输出是(D)void prtv(int *x)printf("%d\n", ++*x);}main(){ int a=25;prtv(&a);}A) 23 B) 24 C) 25D) 267、有以下函数(B)char fun(char *p){ return p; }该函数的返回值是A) 无确切的值B) 形参p中存放的地址值C) 一个临时存储单元的地址D) 形参p自身的地址值8、下列程序的输出结果是(7)#include<stdio.h>void fun (int *p1, int *p2){ if (*p1>*p2) printf ("%d\n",*p1);else printf ("%d\n",*p2);}void main ( ){ int a=3,b=7;fun (&a, &b);}9、下列程序的运行结果是(B)void fun(int *a, int *b){ int *k;k=a; a=b; b=k;}main(){ int a=3, b=6, *x=&a, *y=&b;fun(x,y);printf("%d %d", a, b);}A) 6 3 B) 3 6 C) 编译出错D) 0 010、以下程序调用findmax函数返回数组中的最大值(B)findmax(int *a,int n){ int *p,*s;for(p=a,s=a; p-a<n; p++)if ( ) s=p;return(*s);}main(){ int x[5]={12,21,13,6,18};printf("%d\n",findmax(x,5));}在下划线处应填入的是(B)A) p>s B) *p>*s C) a[p]>a[s] D) p-a>p-s11、下列程序段的输出结果是(A)void fun(int *x, int *y){ printf("%d %d", *x, *y); *x=3; *y=4;}main(){ int x=1,y=2;fun(&y,&x);printf("%d %d",x, y);}A) 2 1 4 3 B) 2 1 3 4 C) 1 2 1 2 D) 2 1 1 212、以下程序执行后输出的结果是___84________。
c语⾔程序设计第五版课后答案谭浩强第⼋章课后答案c语⾔程序设计第五版课后答案谭浩强习题答案第⼋章善于利⽤指针本章习题均要求使⽤指针⽅法处理。
1. 输⼊3个整数,要求按由⼩到⼤的顺序输出。
解题思路:先获取到三个变量的地址,然后获取三个数据,通过指针进⾏⽐较转换即可答案:#include <stdio.h>void swap(int *p_a, int *p_b){int temp = *p_a;*p_a = *p_b;*p_b = temp;}int main(){int a, b, c, *p_a = &a, *p_b = &b, *p_c = &c; // 获取每个变量空间的地址printf("Please enter three numbers:");scanf_s("%d%d%d", p_a, p_b, p_c);if (*p_a > *p_b) {swap(p_a, p_b);//通过指针进⾏指向空间内的数据交换}if (*p_a > *p_c) {swap(p_a, p_c);}if (*p_b > *p_c) {swap(p_b, p_c);}printf("%d %d %d\n", *p_a, *p_b, *p_c);system("pause");return 0;}2. 输⼊3个字符串,要求按由⼩到⼤的顺序输出。
解题思路:字符串的⽐较可以使⽤strcmp函数,返回值>0表⽰⼤于,返回值⼩于0表⽰⼩于,返回追等于0表⽰相同。
其他的⽐较排序思路与数字的排序交换没有区别,逐个进⾏⽐较先找出最⼤的,然后找出第⼆⼤的。
答案:#include <stdio.h>int main(){char str[3][32];char *p[3];printf("Please enter three strings:");for (int i = 0; i < 3; i++) {p[i] = str[i];scanf_s("%s", p[i], 32);//后边的数字限制缓冲区边界,防⽌缓冲区溢出访问越界}//让p[0]和p[1]/p[2]分别进⾏⽐较,找出最⼤的字符串,i+1之后,则让p[1]和p[2]进⾏⽐较,找出第⼆⼤//i循环总个数-1次,最后⼀个是不需要⽐较的for (int i = 0; i < 2; i++) {for (int j = i + 1; j < 3; j++) {if (strcmp(p[i], p[j]) > 0) {char *tmp = p[i]; p[i] = p[j]; p[j] = tmp;}}}printf("%s %s %s\n", p[0], p[1], p[2]);system("pause");return 0;}3. 输⼊10个整数,将其中最⼩的数与第⼀个数对换, 把最⼤的数与最后⼀个数对换。
第八章指针的使用【学习目标】本章将详细介绍在C语言中如何使用指针。
学习要点包括如下几点:(1)掌握指针和指针变量的概念,了解指针变量的特点以及直接访问数据和间接访问数据的原理。
(2)掌握指针变量的定义、赋值方法及指针运算符的使用,熟练运用指针访问简单变量。
(3)熟悉指针和一维数组的关系,掌握指向一维数组的指针变量的定义方法,熟练使用指针变量访问一维数组元素。
(4)了解指针与字符串的关系,能熟练使用指针处理字符串。
(5)熟练掌握用指针变量作函数的参数时函数的定义和调用方法、数组名作函数的参数用法。
(6)指向指针的指针的运用。
【学习导航】本章的在整个课程中的位置如图5-1所示。
图8-1 本章学习导航在本书的第一章介绍C语言有一个灵活性的特点,那么它的灵活性具体体现在哪里呢?其实就是指针。
指针是C语言的精华部分,通过利用指针,我们能很好地利用内存资源,使其发挥最大的效率。
有了指针技术,我们可以描述复杂的数据结构,对字符串的处理可以更灵活,对数组的处理更方便,使程序的书写简洁,高效。
8.1 地址和指针指针是C语言的一种数据类型,类似于整型、字符型等。
既然指针也是一种类型,那么也可以定义该类型的变量,称为指针变量。
指针变量和其他类型的变量的区别是:指针变量存储的是地址。
所以要学好指针,就一定要明白数据在内存中是如何存储的。
计算机所有数据都是存储在存储器里,系统的内存可看作编了号的小房间,如果要取房间的东西(读取数据)就需要得到房间编号。
地址就是内存区中对每个字节的编号。
下面通过两个整型变量来说明。
整型变量x、y(基本整型需4个字节)在内存中的存储如图8-2所示(假设内存编号是从2000开始)。
把变量所占用的存储单元首字节的地址作为变量的地址。
C语言中利用取地址运算符“&”获取变量的存储地址。
例如,&c将返回c的首地址;&x将返回x的首地址。
2000H2004H2008H2012H...图8-2 变量x和y在内存中的存储图8-2中2000H和2004H就是内存单元的地址。
第8章指针
1. 单项选择题
(1)指针 pstr所指字符串的长度为D。
char *pstr="\t\"1234\\abcd\n"
A.15
B.14
C.13
D.12
(2)若有定义int a[4][6];则能正确表示a数组中任一元素a[i][j](i,j 均在有效范围内)地址的表达式A。
A.&a[0][0]+6*i+j
B.&a[0][0]+4*j+i
C.&a[0][0]+4*i+j
D.&a[0][0]+6*j+i
(3)以下程序段的输出结果为D。
char astr[5]="1234";
char *pstr=astr;
printf("%c",pstr[1]-'0');
A.1
B. 2
C. ASCII码值为 1 的字符
D. ASCII 码值为 2 的字符
(4)下述程序段的输出结果为D。
char astr[]="abcde";
char *pstr=&astr[5];
while(--pstr>=astr)
putchar(*pstr);
putchar('\n');
A. abc
B. cba
C. abcde
D. edcba
(5)若有定义 int a=1,*b,c;,以下不正确的是 A 。
A. b=a
B. b=&a
C. b=&a,c=*b
D. c=a
(6)以下程序段的运行结果为 C 。
intnum[]={1,2,3,4,5,6,7,8,9},*pnum=&num[2];
pnum++;
++pnum;
printf("%d\n",*pnum);
A. 3
B. 4
C. 5
D. 6
(7)以下程序段的运行结果为 B 。
char *pstr="My name is Tom";
int n=0;
while(*pstr++!='\0')
n++;
printf("n=%d\n",n);
A. 12
B. 14
C. 16
D. 不确定
(8)以下程序段的运行结果为 B 。
int num[9]={1,2,3,4,5,6,7,8,9},*p;
p=num;
*(p+1)=0;
printf("%d,%d,%d\n",*p,p[1],(*p)++);
A. 2,0,1
B. 1,0,1
C. 2,2,2
D. 1,1,1
(9)以下程序段的运行结果为 C 。
int a=5,*p=&a,b,*q;
a=10;
*p=15;
q=p;
*q=20;
b=*q;
p=&b;
printf("a=%d,b=%d,*p=%d,*q=%d\n",a,b,*p,*q);
A. a=5,b=10,*p=15,*q=20
B. a=20,b=15,*p=10,*q=5
C. a=20,b=20,*p=20,*q=20
D. a=15,b=15,*p=15,*q=15
(10)下面程序的运行结果是 B 。
intmain ( )
{
int x[5]={2,4,6,8,10}, *p, **pp ;
p=x , pp = &p ;
printf(“%d”,*(p++));
printf(“%3d”,**pp);
return 0;
}
A)4 4 B)2 4 C)2 2 D)4 6
(11)若有定义int x[4][3]={1,2,3,4,5,6,7,8,9,10,11,12};
int (*p)[3]=x ; 则能够正确表示数组元素x[1][2]的表达式是 D 。
A.*((*p+1)[2]) B. (*p+1)+2
C.*(*(p+5)) D. *(*(p+1)+2)
(12)若有说明:
char *language[]={“FORTRAN”,”BASIC”,”PASCAL”,”JAVA”,”C”};则language[2]的值是 B 。
A. 一个字符
B. 一个地址
C. 一个字符串
D. 一个不定值
(13)设有定义:char *cc[2]={“1234”,”5678”};则正确的叙述是 A 。
A. cc数组的两个元素中各自存放了字符串”1234”和”5678”的首地址
B. cc数组的两个元素分别存放的是含有4个字符的一维字符数组的首地址
C. cc是指针变量,它指向含有两个数组元素的字符型一维数组
D. cc数组元素的值分别维”1234”和”5678”
2. 编程题(要求用指针实现)
(1)编写一个函数,实现从键盘上输入 3 个整数,按从大到小的顺序输出。
voidsort(int *x,int *y,int *z)
{
int t;
if(*x<*y)
{t=*x;*x=*y;*y=t;}
if(*x<*z)
{t=*x;*x=*z;*z=t;}
if(*y<*z)
{t=*y;*y=*z;*z=t;}
}
(2)编写一个函数,实现输入一串字符,统计它的字符总数和其中大写字母的个数(不用字符串函数)。
void count(int *n,int *c1,int *c2)
{
inti=0,j=0,k=0,c;
c=getchar();
while(c!='\n')
{
i++;
if(c>='a'&&c<='z') j++;
if(c>='A'&&c<='Z') k++;
c=getchar();
}
*n=i;*c1=j;*c2=k;
}
int main()
{
inta,b,c;
count(&a,&b,&c);
printf("%d,%d,%d\n",a,b,c);
return 0;
}。