C语言 第7章 指针(答案)

合集下载

C语言实验-第七章-第九章2

C语言实验-第七章-第九章2

实验七:指针的应用【实验目的】1.掌握指针和指针变量,内存单元和地址、变量与地址、数组与地址的关系;2.掌握指针变量的定义和初始化,指针变量的引用方式;3.能正确使用数组的指针和指向数组的指针变量;【实验内容】1.填空题输入一个字符串,将其中的大写字母转换成小写字母,然后输出本程序主要是比较scanf()输入和gets()输入的区别#include <stdio.h>void main(){ char s[20];char *p=s;scanf(“%s”,p); /*注意用scanf()输入和gets()输入的区别*/while( 1 ){if( 2 ) *p=*p+ (‘a’-‘A’);p++ ;}puts ( 3 );}答案:1、*p!=’\0’2、(*p>='A')&&(*p<='Z')3、s运行结果:输入:Program输出:program输入:This is Program输出:this提示:scanf ()输入时遇到空格认为字符串结束,用gets()输入时只有遇到回车才认为字符串结束。

如键入any boy并回车,则2。

补充程序题输入15个整数存入一维数组,再按逆序重新调整该数组中元素的顺序然后再输出。

下面给出部分程序的内容,请将程序补充完整,然后上机调试。

部分程序清单如下:#include <stdio.h>void main(){ int a[15],*p1,*p2,x;for(p1=a;p1<a+15;p1++)scanf("%d",p1);for(p1=a,p2=a+14;p1<a+7;p1++,p2--){ x=*p1;*p1=*p2;*p2=x;}……}答案:for(p1=a;p1!=a+15;p1++)printf("%d ",*p1); // %d后面有一个空格运行结果:输入:1 2 3 4 5 6 7 8 9 10 11 12 13 14 15输出:15 14 13 12 11 10 9 8 7 6 5 4 3 2 1提示:(1)在整型数组中,没有结束标志,必须依靠数组中数据元素的个数控制循环次数。

C语言程序设计实训教程第7章 指 针

C语言程序设计实训教程第7章 指 针

12
2)指针与一维数组 【例 7.6】 下列程序的运行结果是( )。[读 程序写结果,重庆市 2001年第 2次等级考试]
13
14
3)指向字符的指针
15
16
17
18
4)指针与二维数组
19
5)指向一维数组的指针(行指针) 【例 7.18】 对 int(﹡p)[5];的正确描述 是( )。[多选题,重庆市 2003年第 1次等级考 试] A. p是数组名 B. p是指针变量名 C. p数组中有 5个元素 D .p指向一个包含 5个元素的整型数组 E. p是一个整型数组 答案:B D
22
7)指针数组 当数组的元素类型为指针时,叫做指针数组。 【例 7.21】 下列程序的运行结果是( )。 [读程序写结果,重庆市 2004年第 2 次等级考试]
23
8)指针做函数参数 指针做函数参数的主要目的是利用在函数中, 利用指针去操作主调函数中的变量。 【例 7.22】 下列程序在数组中同时查找最大 值下标和最小值下标,并分别存放在 main函数的 变量 max和 min中,请填空。[读程序写结果,重 庆市 2003年第 2次等级考试]
10
【例 7.3】 由于指针的数据类型实际上是指定 指针所能指向对象的数据类型,所以不同数据类型 的指针变量不能相互赋值。( )[判断题,重庆市 2005年第 2次等级考试] 答案:对 分析:在某些特定情况下,可以在不同数据类 型指针之间通过强制类型转换赋值。
11
【例 7.4】 若有定义:long intj,﹡p;,则操 作 j=(long int)p;是合法操作。( )[判断题, 重庆市 2004年第 1次等级考试] 答案:对 【例 7.5】 在 C 语言中,程序

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.有以下程序main(){char a[]="programming",b[]="language";char *p1,*p2;int i;p1=a;p2=b;for(i=0;i<7;i++)if(*(p1+i)==*(p2+i))printf("%c",*(p1+i));}输出结果是A)gm B)rg C)or D)ga2.设有说明int(*ptr)[m];其中的标识符ptr是A)M个指向整型变量的指针B)指向M个整型变量的函数指针C)一个指向具有M个整型元素的一维数组的指针D)具有M个指针元素的一维指针数组,每个元素都只能指向整型量3.若已定义:int a[9],*p=a;并在以后的语句中未改变p的值,不能表示a[1] 地址的表达式是A) p+1 B) a+1 C) a++ D) ++p4.若有语句int *point ,a=4;和point =&a;下面均代表地址的一组选项是A. a,point,*&aB. &*a,&a,*pointC. &point,*point,&aD. &a,&*point,point5.下面程序段的运行结果是char a[]=”language”,*p;p=a;while(*p!=’u’) {printf(“%c”, *p-32);p++;}A. LANGUAGEB. LANGuageNGngUAGE6.以下程序的运算结果是*p=1,m=3,n=5 。

#include<stdio.h>void main(){int a[5]={1,2,3,-4,5};int m,n,*p;p=&a[0];m=*(p+2);n=*(p+4);printf("*p=%d,m=%d,n=%d",*p,m,n);}7.写一通用函数slength,求出一个字符串的长度,并用main函数调用slength。

C语言习题答案1-7章

C语言习题答案1-7章

程序设计基础(C语言版)习题第01章绪论一.选择题1.以下叙述中正确的是________。

A)程序设计的任务就是编写程序代码并上机调试B)程序设计的任务就是确定所用数据结构C)程序设计的任务就是确定所用算法D)以上三种说法都不完整参考答案:D【解析】程序设计通常分为问题建模、算法设计、编写代码和编译调试四个阶段。

所以选项A)、B)、C)说法都不完整。

2.以下关于简单程序设计的步骤和顺序的说法中正确的是。

A)确定算法后,整理并写出文档,最后进行编码和上机调试B)首先确定数据结构,然后确定算法,再编码,并上机调试,最后整理文档C)先编码和上机调试,在编码过程中确定算法和数据结构,最后整理文档D)先写好文档,再根据文档进行编码和上机调试,最后确定算法和数据结构参考答案:B【解析】设计一个能解决实际问题的计算机程序需要经过以下几个过程:①建立模型。

②算法设计:给出解决问题的步骤,即算法。

③算法表达:选择一种表达算法的工具,对算法进行清晰的表达。

④编写程序:选择一种程序设计语言,把以上算法程序化,这称为编写程序。

⑤程序调试:对编写好的程序进行调试,修改程序中的错误。

⑥程序文档编写与程序维护。

综上所述,B)选项是符合上述描述的,其他选项不恰当。

3.以下叙述中正确的是________。

A)C程序的基本组成单位是语句B)C程序中的每一行只能写一条语句C)简单C语句必须以分号结束D)C语句必须在一行内写完参考答案:C【解析】函数是C程序的基本组成单位;C语言书写风格很自由,不但一行可以写多个语句,还可以将一个语句写在多行中。

故本题答案为C)。

4.以下叙述中正确的是。

A)C程序中的注释只能出现在程序的开始位置和语句的后面B)C程序书写格式严格,要求一行内只能写一个语句C)C程序书写格式自由,一个语句可以写在多行上D)用C语言编写的程序只能放在一个程序文件中参考答案:C【解析】在C语言中,注释可以加在程序中的任何位置,选项A)错误。

C语言习题集合7(指针)

C语言习题集合7(指针)

第七部分 指针7.1 选择题1. 若有说明:int a=2, *p=&a, *q=p;,则以下非法的赋值语句是()。

A . p=q;B . *p=*q;C . a=*q;D . q=a;2. 若定义:int a=511, *b=&a ;,则printf("%d\n ", *b);的输出结果为:A . 无确定值B . a 的地址C . 512D . 5113. 已有定义 int a=2, *p1=&a, *p2=&a; 下面不能正确执行的赋值语句是()。

A . a=*p1+*p2;B . p1=a;C . p1=p2;D . a=*p1*(*p2);4. 变量的指针,其含义是指该变量的()。

A . 值B . 地址C . 名D . 一个标志5. 若有说明语句:int a, b, c, *d=&c ;,则能正确从键盘读入三个整数分别赋给变量a 、b 、c 的语句是()。

A . scanf("%d%d%d ", &a, &b, d);B . scanf("%d%d%d ", a, b, d);C . scanf("%d%d%d ", &a, &b, &d);D . scanf("%d%d%d ", a, b,*d);6. 若已定义int a=5; 下面对(1)、(2)两个语句的正确解释是()。

(1) int *p=&a; (2) *p=a;A . 语句(1)和(2)中的*p 含义相同,都表示给指针变量p 赋值。

B . (1)和(2)语句的执行结果,都是把变量a 的地址值赋给指针变量p 。

C . (1)在对p 进行说明的同时进行初始化,使p 指向a ;(2)变量a 的值赋给指针变量p 。

D . (1)在对p 进行说明的同时进行初始化,使p 指向a ;(2)将变量a 的值赋予*p 。

C语言第7章_指针

C语言第7章_指针

退出
指针运算
算术运算 int *p, a[10]; p = a; p++; /*p的值增加多少?*/ 的值增加多少? 的值增加多少 指针的加减运算是以其指向的 指针的加减运算是以其指向的 类型的字节长度为单位的 类型的字节长度为单位的
6000 6001 6002 6003 6004 6005 6006
swap函数的几种错误形式(3/3) 函数的几种错误形式 3/3)
指针p没有确切地址 指针 没有确切地址 void Swap(int *p1, int *p2) { int *p; /*指针 未初始化*/ /*指针p未初始化*/ 指针p未初始化 *p = *p1; *p1 = *p2; *p2 = *p; }
退出
寻址方式
如何读写内存中的数据? 如何读写内存中的数据? 两种寻址方式 直接(寻址)访问 直接(寻址)
通过变量地址直接存取变量内容
0 ┇ 3 6 9 ┇ 3010 2000 变量 i_pointer 变量 i 变量 j 变量 k 内存用户数据区
通过变量的地址访问变量所在的 2000 存储单元
2002 2004
退出
指针运算
赋值运算 指针在使用前一定要赋值 为指针变量赋的值必须是一个地址 main() { int *p; scanf("%d",p); … }
错! 但TC下不报错 下不报错 VC下报错 下报错
main() { int a,*p=&a; scanf("%d",p); … }
退出
指针与函数
指针既然是数据类型,自然可以做函数参数和返回值 指针既然是数据类型, 的类型 指针做函数参数的经典例子: 指针做函数参数的经典例子:
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

第7章指针一、选择题1、变量的指针,其含义是指变量的(B)A)值B)地址C)名D)一个标志2、若有以下定义:int x[10], *pt=x;则对x数组元素的正确引用是(B)A) *&x[10] B) *(x+3) C) *(pt+10) D) pt+33、若有定义语句:double x[5]={1.0,2.0,3.0,4.0,5.0},*p=x;则错误引用x数组元素的是(B)A)*p B)x[5] C)*(p+1) D)*x4、设已有定义:float x;则以下对指针变量p进行定义且赋初值的语句中正确的是(D)A)float *p=1024; B)int *p=(float x);C)float p=&x; D)float *p=&x;5、有以下程序main(){int n,*p=NULL;*p=&n;printf(“Input n:”);scanf(“%d”,&p);printf(“output n:”);printf(“%d\n”,p);}该程序试图通过指针p为变量n读入数据并输出,但程序有多处错误,以下语句正确的是(A)A)int n,*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, *&a B)&*a, &a, *p1 C)* &p1, * p1, &a D)&a, &* p1, p18、下面程序的输出结果是(D)main(){int a=25,*p;p=&a;printf("%d\n",++*p);}A)23 B)24 C)25 D)269、下列函数的功能是(A)int fun (char *x){char *y=x;while(*y++);return(y-x-1);}A)求字符串的长度B)比较两个字符串的大小C)将字符串x复制到字符串y C)将字符串x连接到字符串中y后面10、设有如下定义char *aa[2]={"abcd","ABCD"};则以下说法正确的是(D)A)aa数组的元素的值分别是“abcd”和“ABCD”。

B)aa是指针变量,它指向含有两个数组元素的字符型一维数组。

C)aa数组的两个元素分别存放的是含有4个字符的一维字符数组的首地址。

D)aa数组的两个元素中各自存放了字符'a'和'A'的地址。

11、若有以下定义和语句int a[10]={1,2,3,4,5,6,7,8,9,10},*p=a;则不能表示a数组元素的表达式是(B)A)*p B)a[10] C)*a D)a[p-a]12、下面定义不正确的是(B)A)int *p; B)int p[n]; C)int *p(); D)int (*p)();13、有下面程序(假设int 类型为2个字节)main(){int a[10]={1,2,3,4,5,6,7,8,9,0},*p;p=a;printf("%x\n",p);printf("%x\n",p+9); }该程序有两个printf函数,如果第一个printf输出的是194,则第二个printf输出的结果是(D)A)203 B)204 C)1a4 D)1a614、下面程序的输出结果是(D)main(){char p1[10]="abc", *p2="ABC", str[50]="xyz";strcpy(str+2,strcat(p1,p2));printf("%s\n",str);}A)xyzabcABC B)zabcABC C)yzabcABC D)xyabcABC15、有以下程序main(){char str[]="xyz",*ps=str;while(*ps) ps++;for(ps--;ps-str>=0;ps--) puts(ps);}执行后输出结果是(C)A) yz<回车>xyz B) z<回车>yzC) z<回车>yz<回车>xyz D) x<回车>xy<回车>xyz16、下面程序的输出结果是(C)main(){int a[]={2,4,6,8,10};int y=1,x,*p;p=&a[1];for(x=0;x<3;x++)y+=*(p+x);printf("%d\n",y); }A)17 B)18 C)19 D)2017、以下程序输出的结果是(A)void fun1(char *p){char *q;q=p;while(*q!=’\0’){(*q)++;q++;}}main(){char a[]={“Program”},*p;p=&a[3];fun1(p);printf(“%s\n”,a);}A)Prohsbn B)Prphsbn C)Progsbn D)Program18、设有如下定义:int (*ptr)();则以下叙述中正确的是(C)。

A)ptr是指向一维数组的指针变量B)ptr是指向int型数据的指针变量C)ptr是指向函数的指针,该函数返回一个int型数据D)ptr是一个函数名,该函数的返回值是指向int型数据指针19、若有以下定义:int a[2][3]={2,4,6,8,10,12};则以下描述正确的是( )A)*(a+1)为元素a[1][0]的指针B)a[1]+1为元素a[1][1]的指针C)*(a+1)+2为元素a[1][2]的指针D)*a[1]+2的值是1220、以下程序的运行结果是(A)#define NULL 0main(){int a[]={1,2,3,4,5,6,7,8,9,10,11,12};int *p=a+5,*q=NULL;*q=*(p+5);printf("%d%d\n",*p,*q);}A)运行后报错B)6 6 C)6 11 D)5 521、若有以下说明:int w[3][4]={{0,1},{2,4},{5,8}};int (*p)[4]=w;则数值为4的表达式是(D)A)*w[1]+1 B)p++,*(p+1) C)w[2][2] D)p[1][1]22、以下程序的运行结果是(D)main(){ char a[]="programming",b[]="language";char *p1,*p2;int i;p1=a;p2=b;for(i=0;i<7;i++)if(*(p1+i)==*(p2+i))printf("%c",*(p1+i)); }A)gm B)rg C)or D)ga23、有以下程序void fun(char *a, char *b){ a=b; (*a)++; }main(){char c1='A',c2='a',*p1,*p2;p1=&c1;p2=&c2;fun(p1,p2);printf("%c%c\n",c1,c2);}程序运行后的输出结果是(A)A)Ab B)aa C)Aa D)Bb24、若程序中已包含头文件stdio.h,以下选项中,正确运用指针变量的程序段是(D)A)int *i=NULL; B) float *f=NULL;scanf("%d",i); *f=10.5;C)char t='m', *c=&t; D) long *L;*c=&t; L='\0';25、已定义以下函数fun(int *p){ return *p; }该函数的返回值是(C)A)不确定的值B)形参p中存放的值C)形参p所指存储单元中的值D)形参p的地址值26、若有定义:int *p[3];,则以下叙述中正确的是(B)A)定义了一个基类型为int的指针变量p,该变量具有三个指针B)定义了一个指针数组p,该数组含有三个元素,每个元素都是基类型为int的指针C)定义了一个名为*p的整型数组,该数组含有三个int类型元素D)定义了一个可指向一维数组的指针变量p,所指一维数组应具有三个int类型元素27、已定义以下函数fun(char *p2, char *p1){ while((*p2=*p1)!='\0'){ p1++;p2++; } }函数的功能是(A)A)将p1所指字符串复制到p2所指内存空间B)将p1所指字符串的地址赋给指针p2C)对p1和p2两个指针所指字符串进行比较D)检查p1和p2两个指针所指字符串中是否有'\0'28、有以下程序int *f(int *x,int *y){ if(*x<*y)return x;elsereturn y; }main(){ int a=7,b=8,*p,*q,*r;p=&a; q=&b;r=f(p,q);printf("%d,%d,%d\n",*p,*q,*r); }执行后输出结果是(B)A) 7,8,8 B) 7,8,7 C) 8,7,7 D) 8,7,829、有以下程序,假设程序编译,连接后生成可执行文件my.exemain( int argc, char *argv[]){int i;for(i=1;i<argc;i++)printf(“%s”,argv[i]);printf(“\n”);}如在命令行中打入:this is a big table。

输出结果为:(A)A) is a big table B)big talbe C)a big table D) this is a big table30、有以下程序void f(char p[][10], int n ) /* 字符串从小到大排序*/{char t[10];int i,j;for(i=0;i<n-1;i++)for(j=i+1;j<n;j++)if(strcmp(p[i],p[j])>0) {strcpy( t, p[i]);strcpy(p[i],p[j]);strcpy(p[i],t);}}main( ){char p[5][10]={“abc”,”aabdfg”,”abbd”,”dcdbe”,”cd”};f(p,5);printf(“%d\n”,strlen(p[0]));}则输出结果为(A)A) 3 B) 0 C) 5 D) 2二、程序阅读题1、下面程序的输出是 3 。

相关文档
最新文档