实验7 指针习题及参考答案

合集下载

C语言教材第七章指针实验

C语言教材第七章指针实验

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语言指针习题和答案精选文档

C语言指针习题和答案精选文档

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赋给一个字符数组,然后从第一个字母开始间隔地输出该串。

南工程计院C语言实验七 指针带答案

南工程计院C语言实验七  指针带答案

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、编写一个函数,实现一个字符串的翻转。

指针习题及参考答案_C 语言项目开发实训教程_[共6页]

指针习题及参考答案_C 语言项目开发实训教程_[共6页]

第四篇 习题参考答案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)

指针练习题答案(1)
{int num=0;
while(*(str+num)!=‘\0’) num++;
return(num);}
A.7B.6C.5D.10
19.下面程序的运行结果是()
# include <stdio.h>
main( )
{static char a[ ]=“Language”,b[ ]=“programe”;
2.执行以下程序后,a的值为(),b的值为()
main(0
{int a,b,k=4,m=6,*p1=&k,*p2=&m;
a=p1= =&m;
b=(- *p1)/(*p2)+7;
printf(“a=%d\n”,a);
printf(“b=%d\n”,b);}
[1]A.-1B.1C.0D.4
[2]A.5 B.6C.7D.10
D.*p只能用来说明p是一个指针变量
4.以下程序有错,错误原因是()
main()
{int *p,i;
char *q,ch;
p=&i;
q=&ch;
*p=40;
*p=*q;……….}
A.p和q的类型不一致,不能执行*p=*q;语句;
B.*p中存放的是地址值,因此不能执行*p=40;语句
C.q没有指向具体的存储单元,所以*q没有实际意义
指针单元练习题
一、选择题:
1.以下程序的运行结果是()
sub(int x,int y,int *z)
{*z=y-x;}
main()
{int a,b,c;
sub(10,5,&a);
sub(7,a,&b);
sub(a,b,&c);

实验七 参考答案

实验七  参考答案

实验七指针(参考答案)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指针转换为任何类型的指针。

但是,不同类型的指针之间不能直接转换,除非它们指向的数据类型是兼容的。

结束语:以上是指针测试题及答案大全,希望对您的学习有所帮助。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

上机实验十指针
一.目的要求
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");
}。

相关文档
最新文档