实验7 指针习题及参考答案
- 格式:doc
- 大小:207.00 KB
- 文档页数:4
C语⾔教材第七章指针实验第七章指针第⼀部分知识训练【知识要点】1. 地址与指针指针变量的概念:⽤⼀个变量专门来存放另⼀个变量的地址。
2. 指向变量的指针变量指针变量的形式:基类型 *指针变量名;&: 取地址运算符;*:指针运算符。
3. 指针与数组引⽤⼀个数组元素可以⽤下标法和指针法;可以⽤数组名作函数的参数。
4.指针与函数函数指针变量定义的⼀般形式为:类型说明符 (*指针变量名)();⼀个函数的返回值可以是⼀个函数。
【典型习题与解析】5. char * const p;char const * pconst char *p上述三个有什么区别?【解析】char * const p; //常量指针,p的值不可以修改;char const * p;//指向常量的指针,指向的常量值不可以改;const char *p; //和char const *p。
6. main(){int a[5]={1,2,3,4,5};int *ptr=(int *)(&a+1);printf("%d,%d",*(a+1),*(ptr-1));}输出结果是什么?【解析】答案:输出:2,5*(a+1)就是a[1],*(ptr-1)就是a[4],执⾏结果是2,5。
&a+1不是⾸地址+1,系统会认为加⼀个a数组的偏移,是偏移了⼀个数组的⼤⼩(本例是5个int)。
1)&a是数组指针,其类型为 int (*)[5];⽽指针加1要根据指针类型加上⼀定的值,不同类型的指针+1之后增加的⼤⼩不同。
2)a是长度为5的int数组指针,所以要加 5*sizeof(int),所以ptr实际是a[5],但是prt与(&a+1)类型是不⼀样的(这点很重要),所以prt-1只会减去sizeof(int*) a,&a的地址是⼀样的,但意思不⼀样。
3)a是数组⾸地址,也就是a[0]的地址,&a是对象(数组)⾸地址,a+1是数组下⼀元素的地址,即a[1],&a+1是下⼀个对象的地址,即a[5]。
C语言指针习题和答案精选文档TTMS system office room 【TTMS16H-TTMS2A-TTMS8Q8-一、用指针方法编写一个程序,输入3个整数,将它们按由小到大的顺序输出#include <>void swap(int *pa,int *pb){int temp;temp = *pa;*pa = *pb;*pb = temp;}void main(){int a,b,c,temp;scanf("%d%d%d",&a,&b,&c);if(a>b)swap(&a,&b);if(b>c)swap(&b,&c);if(a>c)swap(&a,&c);printf("%d,%d,%d",a,b,c);}二、C语言用指针方法输入3个字符串按由小到大顺序输出#include ""#include ""int main(int argc, char* argv[]){char *t;char *p1=NULL,*p2=NULL,*p3=NULL;char ch1[20]={0},ch2[20]={0},ch3[20]={0};p1=ch1;p2=ch2;p3=ch3;printf("No1:");scanf("%s",p1);fflush(stdin);printf("No2:");scanf("%s",p2);fflush(stdin);printf("No3:");scanf("%s",p3);fflush(stdin);if(strcmp(p1,p2)>0){t=p1;p1=p2;p2=t;}if(strcmp(p1,p3)>0){t=p1;p1=p3;p3=t;}if(strcmp(p2,p3)>0){t=p2;p2=p3;p3=t;}printf("%s\n%s\n%s\n",p1,p2,p3);return 0;}编程输入一行文字,找出其中的大写字母,小写字母,空格,数字,及其他字符的个数#include<>void main(){int a=0,b=0,c=0,d=0,e=0,i=0;char *p,s[20];while((s[i]=getchar())!='\n')i++;p=s;while(*p!=10){if(*p>='A'&&*p<='Z')a++;else if(*p>='a'&&*p<='z')b++;else if(*p==' ')c++;else if(*p>='0'&&*p<='9')d++;else e++;p++;}printf("大写字母 %d 小写字母 %d\n",a,b);printf("空格 %d 数字 %d 非字符 %d\n",c,d,e);}写一个函数,将3 3矩阵转置#include ""void Transpose(int (*matrix)[3]){int temp;int i, j;for(i=1;i<3;i++)/*转置*/{for(j=0;j<i;j++){temp = *(*(matrix+j)+i);*(*(matrix+j)+i) = *(*(matrix+i)+j); *(*(matrix+i)+j) = temp;}}}void main(){int a[3][3] = {{1,2,3},{4,5,6},{7,8,9}}; Transpose(a);for(int i = 0;i<3;i++){for(int j=0;j<3;j++){printf("%d ",a[i][j]);}printf("\n");}}}用指向一维数组的指针做函数参数#include<>#include<>int main(){void sort(char (*s)[6]);3”n",*(month_name+n));elseprintf("It is wrong.\n");}运行结果:① Input month: 2↙It is February.② Input month: 8↙It is August.③ Input month: 13↙It is wrong.9.11c语言:将字符串computer赋给一个字符数组,然后从第一个字母开始间隔地输出该串。
1、编写一个函数,求一组整数中的最大值及位置和最小值及位置。
#include<stdio.h>#include<malloc.h>#include<stdlib.h>int f(int *a,int len,int *pmin,int *pmaxpos,int *pminpos)//一个函数只能返回一个值,其它三个值的传回要用指针来实现{inti,max,min,maxpos,minpos;max=min=a[0];maxpos=min pos=0;for(i=1;i<len;i++){if(max<a[i]){max=a[i];maxpos=i;}if(min>a[i]){min=a[i];minpos=i;}}*pmin=min;*pmaxpos=maxpos;*pminpos=minpos;return max;}main(){intn,i,max,min,maxpos,minpos;printf("请输入数组的元素个数");scanf("%d",&n);int *a;a=(int*)malloc(n*sizeof(int)); //动态生成数组,这样程序通用for(i=0;i<n;i++){a[i]=rand()%100; //随机生成100以内的随机数printf("%5d",a[i]);}printf("\n");max=f(a,n,&min,&maxpos,& minpos);printf("最大值:%d 最大值下标位置:%d 最小值:%d 最小值下标位置:%d\n",max,maxpos,min,min pos);}2、编写一个函数,求出一个字符串的长度(即字符串中字符的个数)。
#include<stdio.h>#include<malloc.h>int strlength(char *);main(){char*s=(char*)malloc(80*sizeof(char) );printf("请输入字符串,包括空格,以回车为结束\n");gets(s);printf("字符串的长度为:%d\n",strlength(s));}int strlength(char *s){int count;for(count=0;*s++;count++);return count;}3、编写一个函数,实现一个字符串的翻转。
第四篇 习题参考答案195 {printf("学号:%10s 姓名:%20s",st[i].num,st[i].name); for(j=0;j<5;j++)printf("%.2f",st[i].score[j]); printf("\n");}}getch();} 运行时输入如下:F100001↙89 78 69 66 78↙zhangshan ↙……………九、指针习题及参考答案一、选择题1.变量的指针,其含义是指该变量的( )。
A .值 B .地址 C .名 D .一个标志【答案】B2.有如下语句:int m=6, n=9, *p , *q; p=&m; q=&n ;如图1所示,若要实现下图所示的存储结构,可选用的赋值语句是( )。
m p n qp q nA .*p=*q ;B .p=*q ;C .p=q ;D .*p=q ;【答案】C 3.若有说明:int a=2, *p=&a , *q=p ;,则以下非法的赋值语句是( )。
A .p=q ;B .*p=*q ;C .a=*q ;D .q=a ;【答案】D 4.下面程序的运行结果是( )。
#include "stdio.h"#include "string.h"main(){char *s1="AbDeG";char *s2="AbdEg";s1+=2;s2+=2;printf("%d\n",strcmp(s1,s2));}C 语言项目开发实训教程196 A .正数B .负数C .零D .不确定的值【答案】B 5.若定义:int a=511, *b=&a ;,则printf("%d\n", *b);的输出结果为( )。
实验七指针(参考答案)1、设计程序sy7-1.c,有三个整形变量i,j,k。
设置三个指针变量p1,p2,p3,分别指向i,j,k。
然后通过指针变量使i,j,k三个变量的值顺序交换,即原来i的值赋给j,把j的原值赋给k,把k的原值赋给i。
i,j,k的原值由键盘输入,要求输出i,j,k的原值和新值。
算法分析:以前能实现两个数的交换,现在换为3个数的交换。
算法应先将k的值赋给中间变量,然后依次将j赋给k,i赋给j,最后将保存在中间变量中的k赋给i;用指针实现,就是去访问每个变量都用指向该变量的指针去间接访问。
参考答案:# include <stdio.h>void main(){int i,j,k,*p1,*p2,*p3,t;printf("请输入i,j,k: ");scanf("%d%d%d",&i,&j,&k);printf("交换前: i=%d j=%d,k=%d\n",i,j,k);p1=&i; p2=&j; p3=&k;//p1指向i,p2指向j,p3指向kt=*p3; *p3=*p2;*p2=*p1,*p1=t;//通过指针间接访问i,j,k并实现交换printf("交换后: i=%d j=%d k=%d\n",i,j,k);}运行结果:2、设计程序sy7-2.c,已知数组{1,3,5,7,9},在其中分别用下标法、地址法和指针法访问数组元素,将它们输出。
算法分析:指针p指向了一维数组a,则对数组元素的访问可以有如下几种方式:a[i],p[i],*(a+i),*(p+i)参考答案:# include <stdio.h>void main(){int a[5]={1,3,5,7,9},i,*p;printf("下标法a[i]: ");for(i=0;i<5;i++)printf("%3d",a[i]);printf("\n 地址法*(a+i):*(a+i):");for(i=0;i<5;i++)printf("%3d",*(a+i));printf("\n指针法*p: ");for(p=a;p<a+5;p++)printf("%3d",*p);printf("\n");}运行结果3、设计程序sy7-3.c,利用字符指针编程,要求在一行文字:“I have 50 Yuan.”中,删去字符‘0’,使其变成:“I have 5 Yuan.”,并输出结果。
二、程序题1、计算字符串中子串出现的次数。
要求:用一个子函数subString()实现,参数为指向字符串和要查找的子串的指针,返回次数。
2、加密程序:由键盘输入明文,通过加密程序转换成密文并输出到屏幕上。
算法:明文中的字母转换成其后的第4个字母,例如,A变成E(a变成e),Z变成D,非字母字符不变;同时将密文每两个字符之间插入一个空格。
例如,China转换成密文为G l m r e。
要求:在函数change中完成字母转换,在函数insert中完成增加空格,用指针传递参数。
3、字符替换。
要求用函数replace将用户输入的字符串中的字符t(T)都替换为e(E),并返回替换字符的个数。
4、编写一个程序,输入星期,输出该星期的英文名。
用指针数组处理。
5、有5个字符串,首先将它们按照字符串中的字符个数由小到大排列,再分别取出每个字符串的第三个字母合并成一个新的字符串输出(若少于三个字符的输出空格)。
要求:利用字符串指针和指针数组实现。
6、定义一个动态数组,长度为变量n,用随机数给数组各元素赋值,然后对数组各单元排序,定义swap函数交换数据单元,要求参数使用指针传递。
7、实现模拟彩票的程序设计:随机产生6个数字,与用户输入的数字进行比较,输它们相同的数字个数(使用动态内存分配)。
/*1、计算字符串中子串出现的次数。
要求:用一个子函数subString()实现,参数为指向字符串和要查找的子串的指针,返回次数。
*/#include<stdio.h>int subString(char *a, char *b){int i = 0;int j = 0;int m = 0;char *p = b;while(*a){while(*a){if(*a == *b){break;}a++;}while(*b){if(*a != *b){return m;}else{m = m;}b++;a++;}// a++;b = p;++m;}return m;}int main(){char a[100];char b[100];printf("请输入字符串a:");gets(a);printf("请输入字符串b:");gets(b);printf("%d", subString(a, b));return 0;}/*2、加密程序:由键盘输入明文,通过加密程序转换成密文并输出到屏幕上。
指针测试题及答案大全一、选择题1. 指针变量的声明方式正确的是()。
A. int *p;B. int *p[];C. int *p[10];D. int (*p)[10];答案:A2. 指针变量可以存储()。
A. 整型数据B. 浮点型数据C. 函数名D. 任意类型的地址答案:D3. 指针变量的值是()。
A. 它所指向的变量的值B. 它所指向的变量的地址C. 它自己的值D. 它自己的地址答案:B4. 指针变量的类型转换时,以下说法正确的是()。
A. 可以将任何类型的指针转换为void指针B. 可以将void指针转换为任何类型的指针C. 可以将char指针转换为int指针D. 可以将int指针转换为char指针答案:A5. 指针变量的算术运算中,以下说法正确的是()。
A. 指针变量可以进行加法运算B. 指针变量可以进行减法运算C. 指针变量可以进行乘法运算D. 指针变量可以进行除法运算答案:B二、填空题1. 指针变量的值是它所指向的变量的________。
答案:地址2. 指针变量的类型转换时,可以将void指针转换为________类型的指针。
答案:任何类型3. 指针变量的算术运算中,指针变量可以进行________运算。
答案:减法三、简答题1. 描述指针变量与数组之间的关系。
答案:指针变量可以指向数组的首元素,从而可以通过指针访问数组中的所有元素。
数组名在大多数情况下可以作为指向数组首元素的指针使用。
2. 解释指针变量的类型转换规则。
答案:指针变量的类型转换遵循C语言的类型转换规则,可以将任何类型的指针转换为void指针,也可以将void指针转换为任何类型的指针。
但是,不同类型的指针之间不能直接转换,除非它们指向的数据类型是兼容的。
结束语:以上是指针测试题及答案大全,希望对您的学习有所帮助。
c语⾔指针指针变量scanf,C语⾔指针练习(包括答案和详解)《C语⾔指针练习(包括答案和详解)》由会员分享,可在线阅读,更多相关《C语⾔指针练习(包括答案和详解)(21页珍藏版)》请在⼈⼈⽂库⽹上搜索。
1、第7章第7章指针71选择题1说明:int a=2,*p=,以下错误的赋值语句为(D):a p=q;b * p=* q;c a=* q;d q=a;a是整数,int*p,*q定义指针,p,q是指向整数的指针。
p获取a的地址,q获取p的地址p。
q是指针(即地址),*p和*q是此指针指向的整数值(此地址中存储的值)。
a)如果将q的地址分配给p,则p和q完全相同。
都指向数字2 B。
)q的数据个p C) q的数据为a D)a的数据为2。
⽆法提供地址。
如果未定义*q=a 2,则:int a=511,*b=的输出为:D A未确定的值B a的地址C 512D 511 int a=511,*b=a是a pri。
2、ntf(输出指针变量B)。
也就是说,指向变量的值输出结果511 3中已经有int a=2,*p1=下未正确执⾏的赋值语句为(b)。
Aa=* p1 *p2bp1=a;Cp1=p2da=* P1 *(* p2);据悉,程序中定义了以下语句:int *P1,* P2int k;P1=p2=⽆法在以下语句中正确执⾏是(B) A,k=* P1 * P2b,p2=k;c,P1=P2d,K=* P1 *(* P2);P1 P2是指针,K是整数变量,变量如何为指针赋值?a实际上是k=k k k (P1和P2都指向K,因此*P1*P2实际上是K) C是赋值语句d实际执⾏K=K*K 4变量的指针。
含义是变量(b。
3、)。
a值b地址c名称d标志5如果有说明语句:int a、b、c、* d=b scanf (%d% d% d、a、b、d);C scanf (%d% d% d,d scanf (%d% d% d,a,b,* d);对于Int c,* d=,c是整数数据,d是指向变量c的指针。
指针经典练习题及答案二、程序题1、计算字符串中子串出现的次数。
要求:用一个子函数subString()实现,参数为指向字符串和要查找的子串的指针,返回次数。
2、加密程序:由键盘输入明文,通过加密程序转换成密文并输出到屏幕上。
算法:明文中的字母转换成其后的第4个字母,例如,A变成E(a变成e),Z变成D,非字母字符不变;同时将密文每两个字符之间插入一个空格。
例如,China转换成密文为G l m r e。
要求:在函数change中完成字母转换,在函数insert中完成增加空格,用指针传递参数。
3、字符替换。
要求用函数replace将用户输入的字符串中的字符t(T)都替换为e(E),并返回替换字符的个数。
4、编写一个程序,输入星期,输出该星期的英文名。
用指针数组处理。
5、有5个字符串,首先将它们按照字符串中的字符个数由小到大排列,再分别取出每个字符串的第三个字母合并成一个新的字符串输出(若少于三个字符的输出空格)。
要求:利用字符串指针和指针数组实现。
6、定义一个动态数组,长度为变量n,用随机数给数组各元素赋值,然后对数组各单元排序,定义swap函数交换数据单元,要求参数使用指针传递。
7、实现模拟彩票的程序设计:随机产生6个数字,与用户输入的数字进行比较,输它们相同的数字个数(使用动态内存分配)。
/*1、计算字符串中子串出现的次数。
要求:用一个子函数subString()实现, 参数为指向字符串和要查找的子串的指针,返回次数。
*/#include<stdio.h>int subString(char *a, char *b){int i = 0;int j = 0;int m = 0;char *p = b;while(*a){while(*a){if(*a == *b){break;}a++;}while(*b){if(*a != *b){return m;}else{m = m;}b++;a++;}// a++;b = p;++m;}return m;}int main(){char a[100];char b[100];printf("请输入字符串a:");gets(a);printf("请输入字符串b:");gets(b);printf("%d", subString(a, b));return 0;}/*2、加密程序:由键盘输入明文,通过加密程序转换成密文并输出到屏幕上。
《高级语言程序设计》实验报告班级: 学号: 姓名: 成绩:实验日期: 年月日实验题目: 实验七指针程序设计实验目的:实验内容: (包括算法说明: 用文字或流程图说明;程序清单;运行结果: 原始数据、相应的运行结果和必要的说明。
)序(程序以文件名sy7_7.c存盘)。
#include<stdio.h>void sort(int *p,int n){int i,j,t;for(i=0;i<n-1;i++)for(j=0;j<n-i-1;j++)if(*(p+j)>*(p+j+1)) //由小到大排序{ t=*(p+j); *(p+j)=*(p+j+1);*(p+j+1)=t;} }void main(){int a[10],i;printf("输入%d个正数: ",10);for(i=0;i<10;i++)scanf("%d",&a[i]);sort(a,10); //调用排序函数printf("排序后: \n");for(i=0;i<10;i++)printf("%5d",a[i]);printf("\n");}把当前的字母变成后面第3个字母, 如最后三个字母x、y、z变成字母a、b、c。
再设计一函数把加密字符还原(程序以文件名sy7_8.c存盘)。
#include<stdio.h>void jiami(char *ch){ char *p=ch;while(*p!='\0'){ if(*p>='a' && *p<='z'|| *p>='A'&& *p<='Z'){*p=*p+3;if(*p>'Z'&&*p<'a' ||*p>'z') *p=*p-26;}++p;}}void jiemi(char *ch){ char *p=ch;while(*p!='\0'){ if(*p>='a'&& *p<='z'||*p>='A'&& *p<='Z'){ *p=*p-3;if(*p<'A'||*p<'a'&&*p>'Z') *p=*p+26;}++p;}}void main(){char line[80];printf("请输入一行字符:\n");gets(line);jiami(line);puts(line);jiemi(line);puts(line);}(3)编写一个程序实现如下功能: 输入一个字符串, 内有数字和非数字字符, 如: a123x456 17960?302tab5876 将其中连续的数字作为一个整数, 依次存放到一数组a中。
C语言程序设计实验教学(7)【实验目的】指针是C语言中非常重要的一章内容。
通过实验让学生掌握各类指针的定义与引用、例如:指向一般变量的指针、指向数组的指针应用、字符指针的应用、指针数组的应用、指向指针的指针的应用。
【实验要求】使用指针来完成变量的引用,编写程序理解指针的含义。
【实验课时】8.0【实验内容】1.通过指针变量求三个变量中的最大值和最小值。
#include <stdio.h>#include <conio.h>void main(){ int a,b,c,*pmax,*pmin; clrscr();printf("Please input three numbers:\n");scanf("%d,%d,%d",&a,&b,&c);if(a>b) /*使pmax指向a,b中大的数,pmin指向a,b中小的数*/{pmax=/**/ &a /**/;pmin=/**/ &b /**/;}else{pmax=/**/ &b /**/;pmin=/**/ &a /**/;}if(c>*pmax) pmax=/**/ &c /**/; /*使pmax指向变量a,b,c中最大的数*/ if(c<*pmin) pmin=/**/ &c /**/; /*使pmin指向变量a,b,c中最小的数*/ printf("max=%d\nmin=%d\n",/**/ *pmax /**/,/**/ *pmin /**/);}2. 输入3个整数,按照从小到大的次序输出。
#include <stdio.h>#include <conio.h>void main( ){ int a,b,c; int *pa=&a,*pb=&b,*pc=&c,*temp;clrscr();printf("Please input three numbers:\n");scanf("%d,%d,%d",&a,&b,&c);if(*pa>*pb){/**/ temp=pa,pa=pb,pb=temp /**/;} /*使pa指向a,b中小的数*/if(*pa>*pc){/**/ temp=pa,pa=pc,pc=temp /**/;} /*使pa指向a,b,c中最小的数*/ if(*pb>*pc){/**/ temp=pb,pb=pc,pc=temp /**/;} /*使pb指向a,b,c中次小的数*/ printf("%d,%d,%d\n",*pa,*pb,*pc);}运行结果如下:Input three integers n1,n2,n3: 34,21,25↙Now, the order is: 21,25,343.将输入的10个整数存入一数组a中,然后输出数组元素中的最大值与次最大值。
(完整)指针综合练习题(带答案).编辑整理:尊敬的读者朋友们:这里是精品文档编辑中心,本文档内容是由我和我的同事精心编辑整理后发布的,发布之前我们对文中内容进行仔细校对,但是难免会有疏漏的地方,但是任然希望((完整)指针综合练习题(带答案).)的内容能够给您的工作和学习带来便利。
同时也真诚的希望收到您的建议和反馈,这将是我们进步的源泉,前进的动力。
本文可编辑可修改,如果觉得对您有帮助请收藏以便随时查阅,最后祝您生活愉快业绩进步,以下为(完整)指针综合练习题(带答案).的全部内容。
指针综合练习题一、选择题1.若有以下定义,则对a数组元素的正确引用是____d_____。
int a[5],*p=a;a)*&a[5] b)a+2 c)*(p+5) d)*(a+2)2.若有定义:int a[2][3],则对a数组的第i行j列元素地址的正确引用为__d____.a)*(a[i]+j) b)(a+i) c)*(a+j) d)a[i]+j3.若有以下定义,则p+5表示___a____。
int a[10],*p=a;a)元素a[5]的地址 b)元素a[5]的值c)元素a[6]的地址 d)元素a[6]的值4.设p1和p2是指向同一个字符串的指针变量,c为字符变量,则以下不能正确执行的赋值语句是____b____。
a)c=*p1+*p2; b)p2=c c)p1=p2 d)c=*p1*(*p2);5.若有说明语句char a[]="It is mine";char *p=”It is mine”;则以下不正确的叙述是___d_____。
a)a+1表示的是字符t的地址b)p指向另外的字符串时,字符串的长度不受限制c)p变量中存放的地址值可以改变d)a中只能存放10个字符二、填空题1 指针变量保存了另一变量的(1)值,不可以任意给指针变量赋一个地址值,只能赋给它 (2)和(3)的地址。
使用变量名来访问变量,是按(4)来直接存取变量称为 (5)方式;而借助指针变量取得另一变量的地址,访问该变量称为(6) 方式。
第7章指针(答案)第7章指针(答案)第7章指针一、选择题1.指向变量的指针,表示(b)a)值b)地址C)名称d)变量的标志。
2.如果有以下定义:intx[10],*Pt=x;则对x数组元素的正确引用是(b)a) *&x[10]b)*(x+3)c)*(pt+10)d)pt+33、若有定义语句:doublex[5]={1.0,2.0,3.0,4.0,5.0},*p=x;则错误引用x数组元素的是(b)a)*pb)x[5]c)*(p+1)d)*x4.Floatx:现有定义;在以下定义指针变量p并分配初始值的语句中,正确的语句是(d)a)float*p=1024;b) int*p=(floatx);c) floatp=&x;d)浮动*p=&x;5.有以下程序(主要){intn,*p=null;*p=&n;printf(“inputn:”);scanf(“%d”和“p”);printf(“outputn:”);printf(“%d\\n”,p);}该程序试图通过指针p为变量n读入数据并输出,但程序有多处错误,以下语句正确的是(a)a)intn,*p=null;b)*p=&n;c)scanf(“%d”,&p)d)printf(“%d\\n”,p);6、若有说明:int*p,m=5,n;以下正确的程序段是(d)a)p=&n;b)p=&n;scanf(“%d”和“p”);scanf(“%d”,*p);c) scanf(“%d”和“&n”);d) p=&n;*p=n;*p=m;7、若有语句int*p1,a=4;和p1=&a;下面均代表地址的一组选项是(c)a)a,p1,*&ab)&*a,&a,*p1c)*&p1,*p1,&ad)&a,&*p1,p18、下面程序的输出结果是(d)main(){inta=25,*p;p=&a;printf(\}a) 23B)24C)25d)269。
实验七指针三、实验思考题参考源代码思考题1. shi_7_3_1.cpp#include <iostream.h>#define N 10void invert(int *,int ); //函数说明void main(){ int i, a[N];cout<<"请输入N(=10)个整数:"<<endl;for(i=0;i<N;i++) cin>>a[i];invert(a, N); // 一维数组名是常指针cout<<"颠倒后为:"<<endl;for(i=0;i<N;i++) cout<<a[i]<<" ";cout<<endl;cout<<"\n谢谢使用本程序,再见!"<<endl;cin.get(); //等待用户敲回车键后再关闭程序cin.get();}void invert(int *a,int n){int i=0, j=n-1,t; //while(i<j){t=*(a+i); *(a+i)=*(a+j); *(a+j)=t;//由指针与数组名在表示内存空间与数组元素的等价形式知道,指针可做数组名用,//上述语句也可写成:// t=a[i]; a[i]=a[j]; a[j]=t;i++;j--;}return;}--------------------------------------------------------------------------------------------------思考题2. shi_7_3_2.cpp#include <iostream.h>#define N 10void f(float, int *, float *); //函数说明void main(){ float a,b;int n;cout<<"请输入浮点数:"<<endl;cin>>a;f(a, &n,&b);cout<<a<<"的整数部分为:"<<n<<endl;cout<<a<<"的小数部分为:"<<b<<endl;cout<<endl;cout<<"\n谢谢使用本程序,再见!"<<endl;cin.get(); //等待用户敲回车键后再关闭程序cin.get();}void f(float x, int *m, float *y) //函数定义{*m=(int)x;*y=x-(int)x;}---------------------------------------------------------------------------思考题3. shi_7_3_3.cpp#include <iostream.h>#define N 5int *lookup(int [],int,int);int main(){int k,a,t[N];cout<<"请输入N(=5)个整数:"<<endl;for(k=0;k<N;k++)cin>>t[k];cout<<"请输入您要找的整数:"<<endl;cin>>a;if(lookup(t,N,a)!=NULL)cout<<"找到了"<<a<<endl;elsecout<<"没有找到"<<a<<endl;return 0;}int *lookup(int t[],int n,int val){ int i,*j;j=NULL; // 首先假设没找到!for(i=0;i<n;i++)if (t[i]==val) { j=&t[i]; break;}return j;}----------------------------------------------------------思考题4. shi_7_3_4.cpp#include <iostream.h>#define N 5int main(){int i=0;int lowerChar[26]={0}, upperChar[26]={0},otherChar=0;char s[80]="";cout<<"请输入英文字符串:"<<endl;//cin>>s;cin.getline(s, 80,'\n');while(s[i]!=0){if('a'<=s[i]&&s[i]<='z') lowerChar[s[i]-'a']++;else if('A'<=s[i]&&s[i]<='Z') upperChar[s[i]-'A']++;else otherChar++;i++;}for(i=0;i<26;i++)if(lowerChar[i]!=0)cout<<"小写字符"<<char('a'+i)<<"的个数: "<<lowerChar[i]<<endl; for(i=0;i<26;i++)if(upperChar[i]!=0)cout<<"大写字符"<<char('A'+i)<<"的个数: "<<upperChar[i]<<endl; cout<<"您输入的非英文字符个数:"<<otherChar<<endl;if(s[0]==0)cout<<"您没输入任何有效字符!!"<<endl;cout<<"\n谢谢使用本程序,再见!"<<endl;cin.get(); //等待用户敲回车键后再关闭程序cin.get();return 0;}。
1 对于变量x,其地址可以写成________;对于数组y[10],其⾸地址可以写成________或__________;对于数组元素y[3],其地址可以写成__________或_________。
【分析】变量的地址可以写成“&变量名”。
数组的⾸地址就是数组名,也可以写成第 1个元素的地址“&数组名[0]”。
数组元素的地址可以写成“&数组元素”,也可以写成“数组⾸地址⼗下标”。
【答案】&xy&y[0]&y[3]y+32 设有定义语句“int k,*p1=&k,*p2;”,能完成表达式“p2=&k”功能的表达式可以写成_______________。
【分析】注意原来表达式“p2=&k”的主要功能是将变量k的地址存放到指针变量p2中。
现在变量k的地址已经存放在指针变量pl中,所以完成“p2=&k”功能的表达式是:p2=p1.【答案】p2=p13 设有两条语句“int a,*p=&a;”和“*p= a;”,则下列说法中正确的是()①两条语句中的“*p”含义完全相同②两条语句中的“*p=&a”和“*p=a”功能完全相同③第 1条语句中的“*p=&a”是定义指针变量 p并对其初始化④第2条语句中的“*p=a”是将a的值赋予变量p【分析】分析备选答案①:第1条语句是数据定义语句,其中的“*p”表⽰定义的变量p是指针型变量;第2条语句是赋值语句,其中的“*p”代表它所指向的变量a,所以该备选答案是错误的,不符合题意。
分析备选答案②:第 1条语句中的“*p=&a”是将变量 a的地址以初值⽅式赋予指针变量 p;⽽第 2条语句中的“*p=a”是将变量 a中的值赋予指针变量 P指向的变量(注意也是a,即该语句的作⽤和 a= a完全相同),显然该备选答案是错误的,不符合题意。
再分析备选答案③:显然该答案是正确的,符合题意。
⾄于备选答案④,显然是错误的“*p”是代表指针变量p指向的变量,不能代表指针变量p。
【答案】③4 设有定义语句“ int x,*p= &x;”,则下列表达式中错误的是()①*&x ②&*x ③*&p ④&*p【分析】注意“*”和“&”运算将是同⼀优先级别的,结合性是⾃有向左。
实验7 指针的应用【实验目的】1掌握指针的使用方法。
2掌握引用的使用方法。
3学习const修饰符在指针中的使用方法。
4学习指针在数组中的使用方法。
5掌握指针数组的使用方法。
6学习指针在函数中的使用方法。
7学习使用指针处理字符串的方法。
8学习使用new和delete动态分配内存。
【实验内容】⒈编程输出二维数组a[][2]={11,22,33,44,55 }各数,并输出该数组的每行的首地址及每个元数的地址。
#include <iostream.h>void main(){ int a[][2]={11,22,33,44,55};int i,j,*p[3]={a[0],a[1],a[2]};cout<<"数组a每行的首地址为:\n";for(i=0;i<3;i++) cout<<p[i]<<" ";cout<<endl;cout<<"数组a每个元素的地址为:\n";for(i=0;i<3;i++){for(j=0;j<2;j++) cout<<*(p+i)+j<<" ";cout<<endl; }cout<<endl;cout<<"数组a每个元素的值为:\n";for(i=0;i<3;i++){ for(j=0;j<2;j++) cout<<*(*(p+i)+j)<<" ";cout<<endl; }}⒉使用指向指针的指针输出计算机课程名("Visual Basic","Visual C++", "Delphi","Power Build","Visual Foxpro")#include <iostream.h>void main(){ char *name[]={"Visual Basic","Visual C++","Delphi","Power Build","Visual Foxpro"};char **p =name;for(int i=0;i<5;i++)cout<<*(p+i)<<endl;}⒊从键盘输入一个整数,当该数为偶数时,用函数的指针调用函数sum1输出其不大于该数的偶数和;当该数为奇数时,用函数的指针调用函数sum2输出其不大于该数的奇数和;#include <iostream.h>int sum1(int);int sum2(int);void main(){ int a;int (*f)(int);cout<<"Input a data:";cin>>a;if(a%2==0){ f=sum1;cout<<(*f)(a)<<endl;}else{ f=sum2;cout<<(*f)(a)<<endl;}}int sum1(int m){ int s1=0;for(int i=2;i<=m;i=i+2)s1=s1+i;return s1;}int sum2(int n){ int s2=0;for(int i=1;i<=n;i=i+2)s2=s2+i;return s2;}⒋编写一个程序判定一个字符在一个字符串中出现的次数,如果该字符不出现则返回0。
上机实验十指针
一.目的要求
1.掌握指针的基本概念;
2.掌握指针变量的定义和初始化;
3.掌握用下标、数组名或指针等不同方式引用数组元素;
4.掌握数组名作函数参数的方法;
5.请添加签名,本实验均用指针方法处理。
二.实验内容
【实验题1】
1)程序填空,交换指针p1,p2所指向的变量。
(10 分)
# include <stdio.h>
void main ( )
{
int a=1,b=2, *p1, *p2, pt;
p1=&a; p2=&b;
printf(“*p1=%d, *p2=%d \n”, *p1,*p2);
pt=p1 ; p1=p2 ; p2=pt ;//交换指针变量p1,p2所指向的变量printf(“*p1=%d, *p2=%d \n”,*p1,*p2);
}
运行结果:
2)程序填空,交换指针p1,p2所指变量的值。
# include <stdio.h>
void main ( )
{ int a=1,b=2, *p1, *p2, temp;
p1=&a; p2=&b;
printf(“*p1=%d, *p2=%d \n”, *p1,*p2);
temp=*p1 ; *p1=*p2 ; *p2=temp ;///交换指针p1,p2所指变量的值
printf(“*p1=%d, *p2=%d \n”, *p1,*p2);
}
运行结果:
【实验题2】程序填空:输入三个整型变量i,j,k的值。
请设置三个指针变量p1,p2,p3,分别指向i,j,k。
然后通过p1,p2,p3使i,j,k三个变量的值依次交换,即原来i的值赋给j, 原来j的值赋给k, 原来k的值赋给i。
输出交换后i,j,k的值。
(10 分)
i j
k
分析:三个值轮换跟两个值互换是一样的原理,在变量被赋新值之前必须保证原值已经被保存。
设temp 为临时变量,则temp=i; i=k; k=j; j=temp ,参考以上做法,轮换时要求用指针p1,p2,p3来替代i,j,k. 源程序:
#include <stdio.h>
void main ( )
{ int i,j,k,temp, *p1=&i ,*p2=&j,*p3= &k ;
printf("Input i j k: "); scanf("%d%d%d",&i,&j,&k); //输入i j k
//i-->j-->k-->i
temp=*p1 ;
*p1=*p3 ;
*p3=*p2 ;
*p2= temp;
printf("%d %d %d \n", *p1,*p2, *p3);//输出轮换后的i j k
}
输入:1 2 3
输出:
【实验题3】程序填空:输入三个整数,要求设计2个指针变量p1,p2 ,使p1指向这三个数的最大值,p2指向最小者 ,并输出最大值和最小值。
(10 分)
# include <stdio.h>
void main ( )
{ int a,b,c, *p1, *p2, *p3;
scanf(“%d%d%d”,&a,&b,&c);
// 令p1指向最大值
p1=(a>b)?&a:&b ; //p1指向a,b中较大者
if(*p1<c ) p1=&c;
//令p2指向最小值
p2=(a<b)? &a:&b ; //p2指向a,b中较小者
if(*p2 >c ) p2=&c;
printf(“max=%d, min=%d”, *p1,*p2 );
printf("Hello,c\n" );
}
运行结果:输入1 2 3
输出
【实验题4】程序填空:请用下标、数组名、指针等不同方法来输出数组元素。
(10 分)
方法1:用下标引用数组元素,源程序如下:
#include <stdio.h>
void main ( )
{ int i, a[5]={1,2,3,4,5};
for( i=0 ; i<5 ; i++ )
printf("%d ", a[i] );
printf("\n");
printf(“Hello.c!\n”);
}
方法3:用指针和下标引用数组元素,源程序如下:#include <stdio.h>
void main ( )
{ int i, a[5]={1,2,3,4,5}, *p;
for( p=a , i=0 ; i<5 ; i++ )
printf("%d ",*(p+i) );
printf("\n");
printf(“Hello.c!\n”);
}
由此可见,若指针p=a, 则a[i]≡*(a+ i )≡*(p+ i )≡
&a[i]≡a+ i ≡p+ i
而对指针p进行自增或自减运算,意味着移动指针,即 p++ 表示令指针p指向下(上/下)一个元素,而p-- 表示令指针p指向上(上/下)一个元素。
统一结果为下图:
【实验题5】利用指针,将数组a中的10个整数按相反顺序存放.源程序如下:(10 分)
#include <stdio.h>
void main ( )
{
int i,t, a[10],*p,*q;
printf("Input 10 integers:");
for(i=0; i<10; i++) scanf("%d", &a[i] );
p= a ; q= a+9 ; //p指向首元素,q指向最后一个元素
for( ; p<=q ; p++ , q-- ){ //逐对交换对称元素t= *p; *p= *q; *q=t;
}
for(i=0; i<10; i++) printf("%d ", a[i] );
printf("\n");
printf("Hello,C!\n");
}。