第8章-指针练习题

合集下载

c语言-C程序设计(第四版)谭浩强_课后习题答案第8章

c语言-C程序设计(第四版)谭浩强_课后习题答案第8章

C程序设计(第四版)谭浩强_课后习题答案第8章第8章善于利用指针2208.1指针是什么2208.2指针变量2228.2.1使用指针变量的例子2228.2.2怎样定义指针变量2238.2.3怎样引用指针变量2248.2.4指针变量作为函数参数2268.3通过指针引用数组2308.3.1数组元素的指针2308.3.2在引用数组元素时指针的运算2318.3.3通过指针引用数组元素2338.3.4用数组名作函数参数2378.3.5通过指针引用多维数组2458.4通过指针引用字符串2558.4.1字符串的引用方式2558.4.2字符指针作函数参数2598.4.3使用字符指针变量和字符数组的比较2638.5指向函数的指针2668.5.1什么是函数指针2668.5.2用函数指针变量调用函数2668.5.3怎样定义和使用指向函数的指针变量2688.5.4用指向函数的指针作函数参数2708.6返回指针值的函数2748.7指针数组和多重指针2778.7.1什么是指针数组2778.7.2指向指针数据的指针2808.7.3指针数组作main函数的形参2828.8动态内存分配与指向它的指针变量2858.8.1什么是内存的动态分配2858.8.2怎样建立内存的动态分配2858.8.3void指针类型2878.9有关指针的小结288习题2918-1#include <stdio.h>int main(){ void swap(int *p1,int *p2);int n1,n2,n3;int *p1,*p2,*p3;printf("input three integer n1,n2,n3:");scanf("%d,%d,%d",&n1,&n2,&n3);p1=&n1;p2=&n2;p3=&n3;if(n1>n2) swap(p1,p2);if(n1>n3) swap(p1,p3);if(n2>n3) swap(p2,p3);printf("Now,the order is:%d,%d,%d\n",n1,n2,n3); return 0;}void swap(int *p1,int *p2){int p;p=*p1; *p1=*p2; *p2=p;}#include <stdio.h>#include <string.h>int main(){void swap(char *,char *);char str1[20],str2[20],str3[20];printf("input three line:\n");gets(str1);gets(str2);gets(str3);if(strcmp(str1,str2)>0) swap(str1,str2);if(strcmp(str1,str3)>0) swap(str1,str3);if(strcmp(str2,str3)>0) swap(str2,str3);printf("Now,the order is:\n");printf("%s\n%s\n%s\n",str1,str2,str3);return 0;}void swap(char *p1,char *p2){char p[20];strcpy(p,p1);strcpy(p1,p2);strcpy(p2,p);}8-3#include <stdio.h>int main(){ void input(int *);void max_min_value(int *);void output(int *);int number[10];input(number);max_min_value(number);output(number);return 0;}void input(int *number){int i;printf("input 10 numbers:");for (i=0;i<10;i++)scanf("%d",&number[i]);}void max_min_value(int *number){ int *max,*min,*p,temp;max=min=number;for (p=number+1;p<number+10;p++)if (*p>*max) max=p;else if (*p<*min) min=p;temp=number[0];number[0]=*min;*min=temp;if(max==number) max=min;temp=number[9];number[9]=*max;*max=temp; }void output(int *number){int *p;printf("Now,they are: ");for (p=number;p<number+10;p++)printf("%d ",*p);printf("\n");}8-4#include <stdio.h>int main(){void move(int [20],int,int);int number[20],n,m,i;printf("how many numbers?");scanf("%d",&n);printf("input %d numbers:\n",n);for (i=0;i<n;i++)scanf("%d",&number[i]);printf("how many place you want move?"); scanf("%d",&m);move(number,n,m);printf("Now,they are:\n");for (i=0;i<n;i++)printf("%d ",number[i]);printf("\n");return 0;}void move(int array[20],int n,int m){int *p,array_end;array_end=*(array+n-1);for (p=array+n-1;p>array;p--)*p=*(p-1);*array=array_end;m--;if (m>0) move(array,n,m);}8-5#include <stdio.h>int main(){int i,k,m,n,num[50],*p;printf("\ninput number of person: n="); scanf("%d",&n);p=num;for (i=0;i<n;i++)*(p+i)=i+1;i=0;k=0;m=0;while (m<n-1){if (*(p+i)!=0) k++;if (k==3){*(p+i)=0;k=0;m++;}i++;if (i==n) i=0;}while(*p==0) p++;printf("The last one is NO.%d\n",*p); return 0;}8-6#include <stdio.h>int main(){int length(char *p);int len;char str[20];printf("input string: ");scanf("%s",str);len=length(str);printf("The length of string is %d.\n",len); return 0;}int length(char *p){int n;n=0;while (*p!='\0'){n++;p++;}return(n);}8-7#include <stdio.h>#include <string.h>int main(){void copystr(char *,char *,int);int m;char str1[20],str2[20];printf("input string:");gets(str1);printf("which character that begin to copy?"); scanf("%d",&m);if (strlen(str1)<m)printf("input error!");else{copystr(str1,str2,m);printf("result:%s\n",str2);}return 0;}void copystr(char *p1,char *p2,int m){int n;n=0;while (n<m-1){n++;p1++;}while (*p1!='\0'){*p2=*p1;p1++;p2++;}*p2='\0';}8-8#include <stdio.h>int main(){int upper=0,lower=0,digit=0,space=0,other=0,i=0; char *p,s[20];printf("input string: ");while ((s[i]=getchar())!='\n') i++;p=&s[0];while (*p!='\n'){if (('A'<=*p) && (*p<='Z'))++upper;else if (('a'<=*p) && (*p<='z'))++lower;else if (*p==' ')++space;else if ((*p<='9') && (*p>='0'))++digit;else++other;p++;}printf("upper case:%d lower case:%d",upper,lower);printf(" space:%d digit:%d other:%d\n",space,digit,other); return 0;}8-9#include <stdio.h>int main(){void move(int *pointer);int a[3][3],*p,i;printf("input matrix:\n");for (i=0;i<3;i++)scanf("%d %d %d",&a[i][0],&a[i][1],&a[i][2]);p=&a[0][0];move(p);printf("Now,matrix:\n");for (i=0;i<3;i++)printf("%d %d %d\n",a[i][0],a[i][1],a[i][2]);return 0;}void move(int *pointer){int i,j,t;for (i=0;i<3;i++)for (j=i;j<3;j++){t=*(pointer+3*i+j);*(pointer+3*i+j)=*(pointer+3*j+i);*(pointer+3*j+i)=t;}}8-10-1#include <stdio.h>int main(){void change(int *p);int a[5][5],*p,i,j;printf("input matrix:\n");for (i=0;i<5;i++)for (j=0;j<5;j++)scanf("%d",&a[i][j]);p=&a[0][0];change(p);printf("Now,matrix:\n");for (i=0;i<5;i++){for (j=0;j<5;j++)printf("%d ",a[i][j]);printf("\n");}return 0;}void change(int *p){int i,j,temp;int *pmax,*pmin;pmax=p;pmin=p;for (i=0;i<5;i++)for (j=i;j<5;j++){if (*pmax<*(p+5*i+j)) pmax=p+5*i+j;if (*pmin>*(p+5*i+j)) pmin=p+5*i+j;}temp=*(p+12);*(p+12)=*pmax;*pmax=temp;temp=*p;*p=*pmin;*pmin=temp;pmin=p+1;for (i=0;i<5;i++)for (j=0;j<5;j++)if (((p+5*i+j)!=p) && (*pmin>*(p+5*i+j))) pmin=p+5*i+j;temp=*pmin;*pmin=*(p+4);*(p+4)=temp;pmin=p+1;for (i=0;i<5;i++)for (j=0;j<5;j++)if (((p+5*i+j)!=(p+4))&&((p+5*i+j)!=p)&&(*pmin>*(p+5*i+j)))pmin=p+5*i+j;temp=*pmin;*pmin=*(p+20);*(p+20)=temp;pmin=p+1;for (i=0;i<5;i++)for (j=0;j<5;j++)if (((p+5*i+j)!=p) && ((p+5*i+j)!=(p+4)) && ((p+5*i+j)!=(p+20)) && (*pmin>*(p+5*i+j)))pmin=p+5*i+j;temp=*pmin;*pmin=*(p+24);*(p+24)=temp;}8-10-2#include <stdio.h>int main(){void change(int *p);int a[5][5],*p,i,j;printf("input matrix:\n");for (i=0;i<5;i++)for (j=0;j<5;j++)scanf("%d",&a[i][j]);p=&a[0][0];change(p);printf("Now,matrix:\n");for (i=0;i<5;i++){for (j=0;j<5;j++)printf("%d ",a[i][j]);printf("\n");}return 0;}void change(int *p) //交换函数{int i,j,temp;int *pmax,*pmin;pmax=p;pmin=p;for (i=0;i<5;i++) //找最大值和最小值的地址,并赋给pmax,pmin for (j=i;j<5;j++){if (*pmax<*(p+5*i+j)) pmax=p+5*i+j;if (*pmin>*(p+5*i+j)) pmin=p+5*i+j;}temp=*(p+12); //将最大值与中心元素互换*(p+12)=*pmax;*pmax=temp;temp=*p; //将最小值与左上角元素互换*p=*pmin;*pmin=temp;pmin=p+1;//将a[0][1]的地址赋给pmin,从该位置开始找最小的元素for (i=0;i<5;i++) //找第二最小值的地址赋给pminfor (j=0;j<5;j++){if(i==0 && j==0) continue;if (*pmin > *(p+5*i+j)) pmin=p+5*i+j;}temp=*pmin; //将第二最小值与右上角元素互换*pmin=*(p+4);*(p+4)=temp;pmin=p+1;for (i=0;i<5;i++) //找第三最小值的地址赋给pminfor (j=0;j<5;j++){if((i==0 && j==0) ||(i==0 && j==4)) continue;if(*pmin>*(p+5*i+j)) pmin=p+5*i+j;}temp=*pmin; // 将第三最小值与左下角元素互换*pmin=*(p+20);*(p+20)=temp;pmin=p+1;for (i=0;i<5;i++) // 找第四最小值的地址赋给pminfor (j=0;j<5;j++){if ((i==0 && j==0) ||(i==0 && j==4)||(i==4 && j==0)) continue;if (*pmin>*(p+5*i+j)) pmin=p+5*i+j;}temp=*pmin; //将第四最小值与右下角元素互换*pmin=*(p+24);*(p+24)=temp;}8-11-1#include <stdio.h>#include <string.h>int main(){void sort(char s[][6]);int i;char str[10][6];printf("input 10 strings:\n");for (i=0;i<10;i++)scanf("%s",str[i]);sort(str);printf("Now,the sequence is:\n"); for (i=0;i<10;i++)printf("%s\n",str[i]);return 0;}void sort(char s[10][6]){int i,j;char *p,temp[10];p=temp;for (i=0;i<9;i++)for (j=0;j<9-i;j++)if (strcmp(s[j],s[j+1])>0){strcpy(p,s[j]);strcpy(s[j],s[+j+1]);strcpy(s[j+1],p);}}8-11-2#include <stdio.h>#include <string.h>int main(){void sort(char (*p)[6]);int i;char str[10][6];char (*p)[6];printf("input 10 strings:\n");for (i=0;i<10;i++)scanf("%s",str[i]);p=str;sort(p);printf("Now,the sequence is:\n"); for (i=0;i<10;i++)printf("%s\n",str[i]);return 0;}void sort(char (*s)[6]){int i,j;char temp[6],*t=temp;for (i=0;i<9;i++)for (j=0;j<9-i;j++)if (strcmp(s[j],s[j+1])>0){strcpy(t,s[j]);strcpy(s[j],s[+j+1]);strcpy(s[j+1],t);}}8-12#include <stdio.h>#include <string.h>int main(){void sort(char *[]);int i;char *p[10],str[10][20];for (i=0;i<10;i++)p[i]=str[i];printf("input 10 strings:\n");for (i=0;i<10;i++)scanf("%s",p[i]);sort(p);printf("Now,the sequence is:\n"); for (i=0;i<10;i++)printf("%s\n",p[i]);return 0;}void sort(char *s[]){int i,j;char *temp;for (i=0;i<9;i++)for (j=0;j<9-i;j++)if (strcmp(*(s+j),*(s+j+1))>0){temp=*(s+j);*(s+j)=*(s+j+1);*(s+j+1)=temp;}}8-13#include<stdio.h>#include<math.h>int main(){float integral(float(*)(float),float,float,int);//对integarl函数的声明float fsin(float); //对fsin函数的声明float fcos(float); //对fcos函数的声明float fexp(float); //对fexp函数的声明float a1,b1,a2,b2,a3,b3,c,(*p)(float);int n=20;printf("input a1,b1:");scanf("%f,%f",&a1,&b1);printf("input a2,b2:");scanf("%f,%f",&a2,&b2);printf("input a3,b3:");scanf("%f,%f",&a3,&b3);p=fsin;c=integral(p,a1,b1,n);printf("The integral of sin(x) is:%f\n",c);p=fcos;c=integral(p,a2,b2,n);printf("The integral of cos(x) is:%f\n",c);p=fexp;c=integral(p,a3,b3,n);printf("The integral of exp(x) is:%f\n",c);return 0;}float integral(float(*p)(float),float a,float b,int n){int i;float x,h,s;h=(b-a)/n;x=a;s=0;for(i=1;i<=n;i++){x=x+h;s=s+(*p)(x)*h;}return(s);}float fsin(float x){return sin(x);}float fcos(float x){return cos(x);}float fexp(float x){return exp(x);}8-14#include <stdio.h>int main(){void sort (char *p,int m);int i,n;char *p,num[20];printf("input n:");scanf("%d",&n);printf("please input these numbers:\n");for (i=0;i<n;i++)scanf("%d",&num[i]);p=&num[0];sort(p,n);printf("Now,the sequence is:\n");for (i=0;i<n;i++)printf("%d ",num[i]);printf("\n");return 0;}void sort (char *p,int m) // 将n个数逆序排列函数{int i;char temp, *p1,*p2;for (i=0;i<m/2;i++){p1=p+i;p2=p+(m-1-i);temp=*p1;*p1=*p2;*p2=temp;}}8-15#include <stdio.h>int main(){void avsco(float *,float *);void avcour1(char (*)[10],float *);void fali2(char course[5][10],int num[],float *pscore,float aver[4]); void good(char course[5][10],int num[4],float *pscore,float aver[4]); int i,j,*pnum,num[4];float score[4][5],aver[4],*pscore,*paver;char course[5][10],(*pcourse)[10];printf("input course:\n");pcourse=course;for (i=0;i<5;i++)scanf("%s",course[i]);printf("input NO. and scores:\n");printf("NO.");for (i=0;i<5;i++)printf(",%s",course[i]);printf("\n");pscore=&score[0][0];pnum=&num[0];for (i=0;i<4;i++){scanf("%d",pnum+i);for (j=0;j<5;j++)scanf("%f",pscore+5*i+j);}paver=&aver[0];printf("\n\n");avsco(pscore,paver); // 求出每个学生的平均成绩avcour1(pcourse,pscore); // 求出第一门课的平均成绩printf("\n\n");fali2(pcourse,pnum,pscore,paver); // 找出2门课不及格的学生printf("\n\n");good(pcourse,pnum,pscore,paver); // 找出成绩好的学生return 0;}void avsco(float *pscore,float *paver) // 求每个学生的平均成绩的函数{int i,j;float sum,average;for (i=0;i<4;i++){sum=0.0;for (j=0;j<5;j++)sum=sum+(*(pscore+5*i+j)); //累计每个学生的各科成绩average=sum/5; //计算平均成绩*(paver+i)=average;}}void avcour1(char (*pcourse)[10],float *pscore) // 求第一课程的平均成绩的函数{int i;float sum,average1;sum=0.0;for (i=0;i<4;i++)sum=sum+(*(pscore+5*i)); //累计每个学生的得分average1=sum/4; //计算平均成绩printf("course 1:%s average score:%7.2f\n",*pcourse,average1);}void fali2(char course[5][10],int num[],float *pscore,float aver[4])// 找两门以上课程不及格的学生的函数{int i,j,k,labe1;printf(" ==========Student who is fail in two courses======= \n"); printf("NO. ");for (i=0;i<5;i++)printf("%11s",course[i]);printf(" average\n");for (i=0;i<4;i++){labe1=0;for (j=0;j<5;j++)if (*(pscore+5*i+j)<60.0) labe1++;if (labe1>=2){printf("%d",num[i]);for (k=0;k<5;k++)printf("%11.2f",*(pscore+5*i+k));printf("%11.2f\n",aver[i]);}}}void good(char course[5][10],int num[4],float *pscore,float aver[4]) // 找成绩优秀学生(各门85以上或平均90分以上)的函数{int i,j,k,n;printf(" ======Students whose score is good======\n");printf("NO. ");for (i=0;i<5;i++)printf("%11s",course[i]);printf(" average\n");for (i=0;i<4;i++){n=0;for (j=0;j<5;j++)if (*(pscore+5*i+j)>85.0) n++;if ((n==5)||(aver[i]>=90)){printf("%d",num[i]);for (k=0;k<5;k++)printf("%11.2f",*(pscore+5*i+k));printf("%11.2f\n",aver[i]);}}}8-16#include <stdio.h>int main(){char str[50],*pstr;int i,j,k,m,e10,digit,ndigit,a[10],*pa;printf("input a string:\n");gets(str);pstr=&str[0]; /*字符指针pstr置于数组str 首地址*/pa=&a[0]; /*指针pa置于a数组首地址*/ndigit=0; /*ndigit代表有多少个整数*/i=0; /*代表字符串中的第几个字符*/j=0;while(*(pstr+i)!='\0'){if((*(pstr+i)>='0') && (*(pstr+i)<='9'))j++;else{if (j>0){digit=*(pstr+i-1)-48; /*将个数位赋予digit*/k=1;while (k<j) /*将含有两位以上数的其它位的数值累计于digit*/{e10=1;for (m=1;m<=k;m++)e10=e10*10; /*e10代表该位数所应乘的因子*/digit=digit+(*(pstr+i-1-k)-48)*e10; /*将该位数的数值\累加于digit*/k++; /*位数K自增*/}*pa=digit; /*将数值赋予数组a*/ndigit++;pa++; /*指针pa指向a数组下一元素*/j=0;}}i++;}if (j>0) /*以数字结尾字符串的最后一个数据*/ {digit=*(pstr+i-1)-48; /*将个数位赋予digit*/k=1;while (k<j) /* 将含有两位以上数的其它位的数值累加于digit*/{e10=1;for (m=1;m<=k;m++)e10=e10*10; /*e10代表位数所应乘的因子*/digit=digit+(*(pstr+i-1-k)-48)*e10; /*将该位数的数值累加于digit*/k++; /*位数K自增*/}*pa=digit; /*将数值赋予数组a*/ndigit++;j=0;}printf("There are %d numbers in this line, they are:\n",ndigit);j=0;pa=&a[0];for (j=0;j<ndigit;j++) /*打印数据*/printf("%d ",*(pa+j));printf("\n");return 0;}8-17#include<stdio.h>int main(){int strcmp(char *p1,char *p2);int m;char str1[20],str2[20],*p1,*p2;printf("input two strings:\n");scanf("%s",str1);scanf("%s",str2);p1=&str1[0];p2=&str2[0];m=strcmp(p1,p2);printf("result:%d,\n",m);return 0;}int strcmp(char *p1,char *p2) //两个字符串比较函数{int i;i=0;while(*(p1+i)==*(p2+i))if (*(p1+i++)=='\0') return(0); //相等时返回结果0return(*(p1+i)-*(p2+i)); //不等时返回结果为第一个不等字符ASCII码的差值}8-18#include <stdio.h>int main(){char *month_name[13]={"illegal month","January","February","March","April", "May","June","july","August","September","October", "November","December"};int n;printf("input month:\n");scanf("%d",&n);if ((n<=12) && (n>=1))printf("It is %s.\n",*(month_name+n));elseprintf("It is wrong.\n");return 0;}8-19-1#include <stdio.h>#define NEWSIZE 1000 //指定开辟存区的最大容量char newbuf[NEWSIZE]; //定义字符数组newbufchar *newp=newbuf; //定义指针变量newp,指向可存区的始端char *new(int n) //定义开辟存区的函数new,开辟存储区后返回指针{if (newp+n<=newbuf+NEWSIZE) // 开辟区未超过newbuf数组的大小{newp+=n; // newp指向存储区的末尾return(newp-n); // 返回一个指针,它指向存区的开始位置}elsereturn(NULL); // 当存区不够分配时,返回一个空指针}8-19-2#include <stdio.h>#define NEWSIZE 1000char newbuf[NEWSIZE];char *newp=newbuf;void free(char *p) //释放存区函数{if (p>=newbuf && p< newbuf + NEWSIZE)newp=p;}8-20#define LINEMAX 20 /*定义字符串的最大长度*/int main(){int i;char **p,*pstr[5],str[5][LINEMAX];for (i=0;i<5;i++)pstr[i]=str[i]; /*将第i个字符串的首地址赋予指针数组pstr 的第i个元素*/ printf("input 5 strings:\n");for (i=0;i<5;i++)scanf("%s",pstr[i]);p=pstr;sort(p);printf("strings sorted:\n");for (i=0;i<5;i++)printf("%s\n",pstr[i]);}sort(char **p) /*冒泡法对5个字符串排序函数*/{int i,j;char *temp;for (i=0;i<5;i++){for (j=i+1;j<5;j++){if (strcmp(*(p+i),*(p+j))>0) /*比较后交换字符串地址*/{temp=*(p+i);*(p+i)=*(p+j);*(p+j)=temp;}}}return 0;}8-21#include<stdio.h>int main(){void sort(int **p,int n);int i,n,data[20],**p,*pstr[20];printf("input n:\n");scanf("%d",&n);for (i=0;i<n;i++)pstr[i]=&data[i]; //将第i个整数的地址赋予指针数组pstr 的第i个元素printf("input %d integer numbers:",n);for (i=0;i<n;i++)scanf("%d",pstr[i]);p=pstr;sort(p,n);printf("Now,the sequence is:\n");for (i=0;i<n;i++)printf("%d ",*pstr[i]);printf("\n");return 0;}void sort(int **p,int n){int i,j,*temp;for (i=0;i<n-1;i++){for (j=i+1;j<n;j++){if (**(p+i)>**(p+j)) //比较后交换整数地址{temp=*(p+i);*(p+i)=*(p+j);*(p+j)=temp;}}}}。

第六~八章 概念练习题-附参考答案

第六~八章 概念练习题-附参考答案
A)auto B)static C)extern D)register
11.若有函数定义:
int func()
{
static int m=0;
return m++;
}
以下程序段运行后屏幕输出为()。
int i;
for(i=1;i<=4;i++)
func();
printf("%d",func());
A.0 B.1C.4 D.5
B.函数的定义不可以嵌套,但函数的调用可以嵌套
C.函数的定义和函数的调用均不可以嵌套
D.函数的定义和函数的均可以嵌套
5.以下叙述中正确的是
A)构成C程序的基本单位是函数
B)可以在一个函数中定义另一个函数
C)main()函数必须放在其它函数之前
D)所有被调用的函数一定要在调用之前进行定义
6.用数组名作为函数调用时的实参时,传递给形参的是。
9.下列说法中正确的是:()
A.局部变量在一定范围内有效,且可与该范围外的变量同名。
B如果一个源文件中,全局变量与局部变量同名,则在局部变量范围内,局部变量不起作用。
C.局部变量缺省情况下都是静态变量。
D.函数体内的局部静态变量,在函数体外也有效。
10.未指定存储类别的变量,其隐含的存储类别为()。
main()
{ char s[]=“ABCD”, *P;
for(p=s+1; p<s+4; p++) printf (“%s\n”,p);}
该程序的输出结果是
A) ABCDB) AC) BD)BCD
BCDBCCD
CDCDD
DD

《C语言程序设计》第8章指针

《C语言程序设计》第8章指针
}
10.3.3 指针变量和数组作函数参数 数组名作形参时,接收实参数组的起始地址;
作实参时,将数组的起始地址传递给形参数组。
引入指向数组的指针变量后,数组及指向数 组的指针变量作函数参数时,可有4种等价形式 (本质上是一种,即指针数据作函数参数):
(1)形参、实参都用数组名 (2)形参、实参都用指针变量 (3)形参用指针变量、实参用数组名 (4)形参用数组名、实参用指针变量
(4)指针变量的++、--与&、*的结合
对于指针变量的++、--与&、*的结合 使用,关键要注意按照运算符的优先级和 结合性进行。
例如: int a=2, *p; p=&a;
•表达式:(*p)++,按运算符的优先级,等价于 a++。其含义为:取出指针变量p所指向的内存单 元的值(即a的值),a的值加1,送回a的内存单 元,a的值变为3,p的值未发生变化,仍然指向 变量a。
程序说明:printf("%s\n",s);语句 通过指向字符串的指针变量s,整体引
用它所指向的字符串的原理:系统首先输出s 指向的第一个字符,然后使s自动加1,使 之指向下一个字符;重复上述过程,直至遇到 字符串结束标志。
main() { char string[ ]=”I love Beijing.”; printf(“%s\n”,string); }
3.数组元素的引用 数组元素的引用,既可用下标法,也可用
指针法。
10.3.2 通过指针引用数组元素 如果有“int a [10],*p=a;” ,则: (1)p+i和a+i都是数组元素a [i]的地址。
(2)*(p+i)和*(a+i)就是数组元素a [i]。 int a [3]; a [0]——*a a [1]——*(a +1) a [2]——*(a +2)

C语言程序设计知识点—第8章 指针结构体与预处理命令

C语言程序设计知识点—第8章 指针结构体与预处理命令
比较两个指针 #include<stdio.h> void main () { int *ptrnum1, *ptrnum2; int value = 1; ptrnum1 = &value; value += 10; ptrnum2 = &value; if (ptrnum1 == ptrnum2) printf("\n 两个指针指向同一个地址\n"); else printf("\n 两个指针指向不同的地址\n"); }
指针使用示例 2 void main() { int num1 = 50, num2 = 100; int *ptr1, *ptr2; ptr1 = &num1; printf(" num1 的值是: %d", *ptr1); printf("\n num1 的地址是: %x \n", ptr1); ptr2 = &num2; printf("\n num2 的值是: %d", *ptr2); printf("\n num2 的地址是: %x \n", ptr2); *ptr2 = *ptr1; printf("\n 重新赋值后 num2 的值是: %d", *ptr2); printf("\n 重新赋值后 num2 的地址是: %x\n", ptr2); }
C 语言程序设计知识点
主讲教师:杨剑
第 8 章:指针、结构体与预处理命令
1. 本章目标
理解指针的概念 定义指针变量 掌握对指针的操作 理解指针和数组的关系 理解结构体的概念和定义 理解预处理指令
2. 内存地址
内存是一个连续编址的空间,每一个存储单元都有一个固定的编号,称为内存地址。 内存地址通常用 16 进制数表示。

C二级 第8章 指针

C二级 第8章 指针

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选项中,所谓函数类型是指函数返回值的类型。

C语言程序设计-第8章 练习题

C语言程序设计-第8章  练习题

一、单项选择题题目1标准输出设备显示器的文件流标识符是()。

a. stdinb. stdoutc. stderrd. stdio题目2表示文件结束符的符号常量EOF的值为()。

a. 0b. -1c. 1d. 127题目3假定一个磁盘数据文件占用n个字节的存储空间,则按字节进行编址的范围是()。

a. 1˜(n-1)b. 0˜(n-1)c. 0˜nd. 1˜n题目4在C语言中,为只写操作打开一个文本文件的方式为()。

b. "w"c. "r"d. "a"题目5在C语言中,文本文件的打开方式共有()。

a. 6b. 9c. 12d. 3题目6在C语言中,为读和写操作打开一个二进制文件,若文件不存在则自动建立空文件的打开方式为()。

a. "ab+"b. "w+"c. "rb+"d. "wb+"题目7从一个文本文件中读取以换行符结束的一个字符串的系统函数为()。

a. fgets()b. fputc()d. fputs()题目8向一个文本文件中写入一个字符的系统函数为()。

a. fputs()b. fputc()c. fgetc()d. fgets()题目9向一个二进制文件中写入数据的系统函数为()。

a. fputc()b. fwrite()c. fread()d. fputs()题目10从一个二进制文件中读取数据的系统函数为fread(),它的参数有()。

a. 2个b. 4个c. 3个d. 5个二、判断题题目11一个磁盘数据文件的文件名由文件主名和扩展名所组成,其中间用圆点分开。

对错题目12当向字符文件输出一个换行符时,实际将输出的是回车符或换行符。

对错题目13C语言系统中提供一个用来描述文件属性的类型标识符为FILE。

对错题目14在数据文件打开方式字符串中,字符r、w和a具有确定的含义,分别代表读、写和追加方式。

C语言指针练习+答案+讲解.

C语言指针练习+答案+讲解.

第七章指针7.1 选择题1.若有说明:int a=2, *p=&a, *q=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完全一样了,都指向一个数2B)把q中数据个pC)把q中数据给aD)a中数据是2,不能够给一个地址。

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

A. a=*p1+*p2; B. p1=a; C. p1=p2; D. a=*p1*(*p2);47、已知在程序中定义了如下的语句:int *P1,*P2;int k;p1=&k;p2=&k;则下列语句中不能正确执行是( B )A、k=*P1+*P2;B、p2=k;C、P1=P2;D、K=*P1 * (*P2);P1 P2是指针,K是整型变量,变量怎么可以赋值给指针呢?A其实是执行了K=K+K(P1和P2都指向K,所以*P1 *P2其实都是指K)C是赋值语句D其实执行了K=K*K4.变量的指针,其含义是指该变量的(B)。

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

c语言第8章练习题--指针

c语言第8章练习题--指针

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________。

电气控制与可编程序控制器应用技术第8章 综合练习题答案

电气控制与可编程序控制器应用技术第8章 综合练习题答案

第8章三菱FX2N系列PLC功能指令一、判断题(正确打“√”、错误打“×”)(√):1、3-9、12-17;(×):2、10、11。

二、填空题1. FNC00~FNC246 。

2. 10 ,FNC00~FN09 。

3. 2 , FNCl0、FNCl1 , 8,FNC12~FNC19。

4. 4位BCD,BCD、二进。

5. 条件跳转、转子、中断调用。

三、简答题1.在使用跳转指令时应注意什么?(1)在同一程序中一个指针标号只允许使用一次,不允许在两处或多处使用同一标号。

(2)指针P63表示程序转移到END。

(3)跳转指令的执行条件如果使用M8000,则为无条件跳转,因为在PLC运行时M8000为ON。

2.在使用循环指令时应注意什么?控制PLC反复执行某一段程序,只要将这段程序放在FOR、NEXT之间,待执行完指定的循环次数后(由操作数指定),才能执行NEXT指令后的程序。

循环开始FOR指令和循环结束NEXT指令组成了一对循环指令。

循环指令可以反复执行某一段程序,但要将这一段程序放在FOR-NEXT之间,待执行完指定的循环次数后,才执行NEXT下一条指令。

配对后的FOR-NEXT不能再与其他的FOR-NEXT配对。

3.在使用功能指令应注意什么?大多数功能指令有1至4个操作数,有的功能指令没有操作数;[S]表示源操作数,[D]表示目标操作数;如果可使用变址功能,用[S.]和[D.]表示。

用n和m表示其它操作数,它们常用来表示常数K和H。

4.循环指令的操作方法是:(1)FOR和NEXT指令必须成对使用,缺一不可,FOR在前,NEXT在后。

(2)FOR、NEXT循环指令最多可以嵌套5层。

(3)利用CJ指令可以跳出POR、NEXT循环体。

5.使用加法和减法指令时应该注意:(1)每个数据的最高位为符号位(0为正、1为负)。

(2)加法指令有三个标志:零标志(M8020)、借位标志(M8021)和进位标志(M8022)。

第8章 指针

第8章 指针

已说明过,且变量类型应与指针类型一致。
可以用一个已赋初值的指针去初始化另一 个指针变量。 不要用一个局部变量去初始化 static 型指针。
4、间接引用指针
与指针有关的两个运算符 & 取地址运算符 * 实例: 指针运算符(或称“间接引用”运算符)
void main(){
int a=10; int *pointer_1; pointer_1 = &a; cout<< * pointer_1;

8.1 指针概念
8章
指针
8.5 const指针
8.6 指针与函数
8.2 指针运算
8.3 指针与数组
8.7 字符指针
8.4 堆内存分配
8.9 命令行参数
本章介绍C++的指针。C++语言拥有在运行时获得变量的地址和操作地址 的能力,这种用来操纵地址的特殊类型变量就是指针,指针对于成功地进 行c++语言程序设计是至关重要的。学习本章后要求能够使用指针,能够用 指针给函数传递参数,理解指针、数组和字符串之间的紧密联系,能够声 明和使用字符串数组,正确理解命令行参数。
值。 实例:ch8_9.txt
【 8.5 const指针】
指向常量的指针(常量指针):
在指针定义语句前加上const,表示指向的对象是常量。 不能通过指针来改变所指对象的值,但指针本身可以改 变,可以指向另外的对象。 例: const int a=78;
const int b=28; int c=18; const int *pi=&a; *pi=58; pi=&b; *pi=68; pi=&c; *pi=88; c=98;

C语言程序设计各章练习题

C语言程序设计各章练习题

《C 语言程序设计》各章练习题2016年12月汇编第1-3章 C 语言基础、编程规范、顺序结构程序设计编程题1:设a 和b 均为int 型变量,编写一个程序,通过键盘读入a,b 的值,然后交换a,b 的值。

要求屏幕显示“输入2个整数,用空格隔开”的提示语句,并且输出交换前a,b 的值,交换后a,b 的值。

附加要求:(1)允许定义第3个变量,实现交换;(2)不允许定义第3个变量,实现交换。

第4章选择结构程序设计编程题2:根据下列函数关系写程序,要求提示输入x 的值,输出y 的值。

编程题2:根据下列函数关系写程序,要求提示输入x 的值,输出y 的值。

编程题3:求 ax 2+bx+c=0方程的解。

(只输出b 2-4ac>=0的求解结果,小于0,输出“不予求解!”)第5章 循环结构程序设计编程题4:编程计算∑=ni i 1。

要求提示键盘输入n ,如n 为负数,不予计算,直接返回。

编程题5:编程序计算n !,要求n 从键盘输入,如n 小于0,不予计算。

编程题6:从键盘输入一个数n ,判断n 是否是素数。

编程题6:编写程序输出1~100之间的偶数,要求屏幕显示时5个偶数一行,每个数占5位,右对齐。

编程题7:编程计算100到1000之间有多少个数其各位数字之和是5,并将其输出。

编程题8:求满足下列条件的三位数n,它除以11(整数相除)所得到的商等于n的各位数字的平方和,且其中至少有二位数字相同的数。

编程题9:有一些十进制整数对ab和cd具有如下特性:ab×cd=ba×dc,其中a≠b且c≠d。

如:12×42=21×24。

请编程找出30~50之间满足上述等式所有m,n值,并按上述等式的格式输出。

(×用*表示)编程题10:从键盘上输入一个整数,然后把这个整数的各位逆序输出。

例如,输入123456,输出654321。

第6章数组编程题11:有一个已排好序的数组int a[11]={-5,-3,0,6,8,12,16,28,66,88};,要求输入一个数后,按原来排序的规律将它插入数组中。

C语言程序设计第四版-8-_谭浩强

C语言程序设计第四版-8-_谭浩强

产生“地址传递”的效果。
数组做函数的参数时,也是“地址传递”。 被调用函数不能改变实参指针变量的值,但
可以改变实参指针变量所指向的变量的值。
指针变量
阅读例8.2-例8.5,上机调试,观察结果,分
析掌握。
要求能够熟练地掌握指针变量及其指向的变
化过程,能够在纸上画图表达分析过程。
访问数组——指针的又一重要用途
பைடு நூலகம்
p是普通的变量 注意这两个*p1的 含义不同,前者说 明p1为指针变量, 后者表示p1所指向 的变量。
void swap(int *p1,int *p2) { int p; p=*p1; *p1=*p2; *p2=p; }
指针变量作为函数的参数
指针作实参,对应的形参是指针变量。 C语言的参数传递是“值传递”。 指针变量做参数时,由于其值为变量的地址,
例. 分析以下程序运行结果
int main() { int n1,n2; int *n1_p=&n1, *n2_p=&n2, *pointer; printf("Input n1:"); scanf("%d",n1_p); 两个指针变量交换 printf("Input n2:"); scanf("%d",n2_p); 了它们的值,也就
指针变量的重要作用之一 ——作为函数的参数,实现地址传递
例 函数调用中的值传递
int main() void swap(int p1,int p2) { void swap(int p1,int p2); { int p; int a,b; p=p1; p1=p2; p2=p; scanf("%d,%d",&a,&b); } if(a<b) swap(a,b); printf("%d,%d\n",a,b); 运行结果:a,b没有交换。 原因:C语言中,实参向形参 return 0; 传递数据采用“值传递”, } 形参单独占用内存单元,交

新人教版三年级上册《第8章_可能性-第9章_数学广角》小学数学-有答案-单元检测训练卷C(一)

新人教版三年级上册《第8章_可能性-第9章_数学广角》小学数学-有答案-单元检测训练卷C(一)

新人教版三年级上册《第8章可能性-第9章数学广角》单元检测训练卷C(一)一、填空题.(第3题7分,其它题每空1分,共22分)1. 从盒子里任意摸出1个球,可能性有________种结果,摸出________球的可能性较大,摸出________球的可能性较小。

如果摸出2个球,可能有________种结果。

2. 抽出1张,最有可能是________卡片。

3. 用数字卡片2、4、5能摆出________个不同的三位数,写出来。

________.4. 一个正方体,6个面有4个面涂上红色,2个面涂上了蓝色。

掷一次,可能掷出________种结果。

掷出红色朝上的可能性________,掷出蓝色朝上的可能性________.5. 每份快餐一样荤菜配一样素菜,请你想一想有________种不同的搭配。

6. 指针停在________色的区域可能性最大,停在________色的区域可能性最小。

7. 闭上眼睛只拿一个糖,摸到________的可能性最大,摸到________的可能性最小。

口香糖19个奶糖38个8. 每两个人握一次手,三个人一共握________次,四个人一共握________次。

二、判断题.(下列现象一定会发生的打“√”,有可能发生的打“○”,不可能发生的打“×”.)(每题2分,共10分)太阳是从东方升起,西方落下。

________.(判断对错)12月30日下雪。

________.我一定能长到5米高。

________.小丽用左手写字。

________.我从来不吃饭。

________.三、选择题.(每题2分,共10分)转动指针,停在阴影处可能性最大的是()A. B. C.在()盒子里不可能摸到黑球?A. B. C.给小正方体涂上红、蓝两种颜色,在使掷出红色朝上的可能性比蓝色大,应该按()方案涂色?A.3面涂红色,3面涂蓝色B.全涂蓝色C.5面涂红色,1面涂蓝色每两种水果做一个拼盘,用4种不同的水果可做()种不同的拼盘。

第08章 变量的间接访问——指针 (《程序设计基础(第3版)(C语言)》(王红梅著 清华大学出版社

第08章 变量的间接访问——指针  (《程序设计基础(第3版)(C语言)》(王红梅著 清华大学出版社

/*指针p指向变量x */
( 第
int *q = p ;
/*指针q指向变量p所指向的变量x*/
版 )


x(*p)
大 学

x(*p)
p
10
版 社
p
10
q
3
Page 14
8.1 指针的概念 指针变量的初始化
3
int x = 10; double *q = &x;
/*指针q的基类型是double,不能指向int型变量*/
大 学

计算机系统和编译器有关。
版 社
(3)定义指针变量时需要明确该指针所指向的数据类型,即该指针所指向的内
存单元可以存放什么类型的数据,对指针变量的运算与它所指向的数据类型密
切相关。
Page 11
8.1 指针的概念
指针变量的初始化
3
例如: int *p ;
int *p = NULL ;
/*NULL为空指针*/
出 版
int *p = NULL, *q = NULL;
/*指针p和q均初始化为空*/

p = &x;
/*指针p指向变量x*/
q = p;
/*指针q指向指针p所指内存单元*/
3
Page 17
8.1 指针的概念
指针变量的操作
1. 指针变量的赋值
通常不允许将一个整数赋给指针变量,由于指针的操作需要编程人员保
指针变量的初始化
3
【语法】初始化指针变量的一般形式如下:
基类型 *指针变量名 = 内存地址 ;
程 序 设



【语

】定

第8章习题解答

第8章习题解答

第8章思考题及习题8参考答案一、填空1. 单片机存储器的主要功能是存储和。

答:程序、数据。

2.假设外部数据存储器2000H单元的内容为80H,执行下列指令后累加器A中的内容为。

MOV P2,#20HMOV R0,#00HMOVX A,@R0答:80H。

3.在存储器扩展中,无论是线选法还是译码法最终都是为扩展芯片的端提供控制信号。

答:片选。

4.起止范围为0000H~3FFFH的数据存储器的容量是 KB。

答:16KB。

5.在AT89S52单片机中,PC和DPTR都用于提供地址,但PC是为访问存储器提供地址,而DPTR是为访问存储器提供地址。

答:程序、数据。

6.11条地址线可选个存储单元,16KB存储单元需要条地址线。

答:2K,14。

7.4KB RAM存储器的首地址若为0000H,则末地址为 H。

答:0FFF。

8.若单片机外扩32KB 数据存储器的首地址若为4000H,则末地址为 H。

答:BFFF9. 设计一个以AT89S52单片机为核心的系统,如果不外扩程序存储器,使其内部8KB闪烁程序存储器有效,则其引脚应该接。

答:EA*,+5V10.74LS138是具有3个输入的译码器芯片,其输出常作片选信号,可选中片芯片中的任一芯片,并且只有1路输出为电平,其它输出均为电平。

答:8,低,高;二、单选1.区分AT89S51单片机片外程序存储器和片外数据存储器的最可靠方法是。

A.看其位于地址范围的低端还是高端B.看其离AT89S51单片机芯片的远近C.看其芯片的型号是ROM还是RAMD.看其是与RD信号连接还是与PSEN信号连接答:D2.访问片外数据存储器的寻址方式是。

A.立即寻址B.寄存器寻址C.寄存器间接寻址D.直接寻址答:C3.若要同时扩展4片2KB的RAM和4片4KB的ROM,则最少需要根地址线。

A、12B、13C、14D、154.当EA=1时,AT89S52单片机可以扩展的外部程序存储器的最大容量为。

A. 64KB B.60KB C.58KB D.56KB答:D5. 若某数据存储器芯片地址线为12根,那么它的存储容量为。

第8章习题解答

第8章习题解答

第8章习题解答一. 选择题1. 关于类和对象,不正确的说法是()A. 类是一种数据类型,它封装了数据和函数B. 类是对某一类对象的抽象C. 可以基于类这种数据类型定义类的引用D. 一个类的对象只有一个【答案】D【解析】类是一种数据类型,可以基于“类”这种数据类型定义多个称为“对象”的变量。

2. 类定义的外部,可以被访问的类的成员有()A. public 的类成员B. public或private的类成员C. private或protected的类成员D. public或private 的类成员【答案】A【解析】类的成员数据或成员函数的访问属性分为三种情况:private、public和protected,即私有访问属性、公有访问属性和保护访问属性,类定义的外部只能访问公有访问属性的成员。

3 关于this 指针,说法错误的是()A. this指针必须显式说明B. 当创建一个对象后,this 指针就指向该对象C. 成员函数拥有this指针D. 静态成员函数拥有this指针【答案】D【解析】this指针是一种特殊的指针,它指向成员函数当前操作的数据所属的对象。

不同的对象调用相同的成员函数时,this指针将指向不同的对象,也就可以访问不同对象的成员数据。

而静态成员函数是一个类的所有对象共享的成员,而不仅仅是某一对象的成员。

因此,可以在没有任何对象存在的情况下,可以使用静态成员函数,而使用this指针必须有明确的对象所指。

4. 调用形式参数为普通对象的函数时,系统会自动调用相应类的()A. 名字不同于类名的一般成员函数B. 构造函数C. 析构函数D. 拷贝构造函数【答案】D【解析】若函数的形参为类的对象,调用函数时,实参赋值给形参,系统自动调用拷贝构造函数实现拷贝赋值。

5. 定义某类的对象后,再删除该对象,系统会自动调用()A. 名字不同于类名的一般成员函数B. 拷贝构造函数C. 构造函数D. 析构函数【答案】D【解析】当对象生存期结束时,需要调用析构函数,释放对象所占的内存空间。

c语言程序设计第五版课后答案谭浩强第八章课后答案

c语言程序设计第五版课后答案谭浩强第八章课后答案

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个整数,将其中最⼩的数与第⼀个数对换, 把最⼤的数与最后⼀个数对换。

指针题库

指针题库

第五章指针一、选择题1. 以下程序的输出结果是。

#include <stdio.h>void main( ){char a[10]={'1','2','3','4','5','6','7','8','9',0},*p;int i;i=8;p=a+i;printf ("%s\n",p-3);}A)6 B)'6' C)6789 D)789答案:C2. 若有语句:char *line[5];,以下叙述中正确的是______。

A)定义line是一个指针数组,每个数组元素是一个基类型为char的指针变量 B)定义line是一个指针变量,该变量可以指向一个长度为5的字符型数组C)定义line是一个指针数组,语句中的*号称为间址运算符D)定义line是一个指向字符型函数的指针答案:A3. 设有定义:int n1=0,n2,*p=&n2,*q=&n1;,以下赋值语句中与n2=n1;语句等价的是 A)*p=*q; B)p=q; C)*p=&n1; D)p=*q;答案:A4.若有定义:int x=0, *p=&x;,则语句printf("%d\n",*p);的输出结果是______。

A)随机值 B)0 C)x的地址 D)p的地址答案:B5.有以下程序#include<stdio.h>void main(){int a[10]={1,2,3,4,5,6,7,8,9,10}, *p=&a[3], *q=p+2;printf("%d\n", *p + *q);}程序运行后的输出结果是______。

A)16 B)10 C)8 D)6答案:B6.有以下程序void main(){int a[3][3],*p,i;p=&a[0][0];for(i=0;i<9;i++) p[i]=i;for(i=0;i<3;i++) printf("%d",a[1][i]);}程序运行后的输出结果是______。

第8-9 章练习 指针与引用

第8-9 章练习 指针与引用

一、选择题1、若有以下定义,则说法错误的是( )。

int a=100,*p=&a ;A .声明变量p ,其中*表示p 是一个指针变量B .变量p 经初始化,获得变量a 的地址C .变量p 只可以指向一个整形变量D .变量p 的值为1002、若有以下定义,则赋值正确的是( )。

int a ,b , *p;float c, *q;A .p=&cB .q=pC .p=NULLD .q=new int3、如果x 是整型变量,则合法的形式是( )。

A .&(x+5)B .*xC .&*xD .*&x4、若要建立如下关系,错误的语句组是( )。

A .B . D .int *p=&x, x; int x, p=&x; int *p, x=10; int *p, x;*p=10; *p=10; *p=&x; p=&x ; x=10;5、若有语句int a[10]={0,1,2,3,4,5,6,7,8,9},*p=a ;则( )不是对a 数组元素的正确引用(其中0≤i <10)。

A .p[i]B .*(*(a+i))C .a[p-a]D .*(&a[i])6、若有以下定义,则变量p 所占内存空间的字节数是( )。

float *p;A.1B.2C.4D.87、 若有以下定义,则赋值错误的是( )。

int a,*p,*q;A. *p=&a ;B.p=new int ;C.q=NULL;D.p=q8、下列程序运行结果是( )。

#include<iostream.h>void main(){int a=10,*q;if(q==NULL)cout<<"####"<<endl;elseq=&a;cout<<*q<<endl;}A. ####B.10C. 有语法错误D.*q9、若程序段static char line[]=”Visual C++”; char *point=line; 则point 的值为( )。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
{
t=*(p+i);
*(p+i)=*(p+8-i);
*(p+8-i)=t*10;
}
for(i=0;i<9;++i)
printf("%d,",a[i]);
}
【17】#include "stdio.h"
sub1(char *a,char b)
{char c;c=*a;*a=b;b=c;}
sub2(char a,char b)
指针思考题
一、填空题
【1】下面函数要求用来求出两个整数之和,并通过形参传回两数相加之和值,请填空。
int add( int x, int y,)
{=x+y;}
【2】若有定义:char ch;
(1)使指针p可以指向变量ch的定义语句是。
(2)使指针p指向变量ch的赋值语句是。
(3)通过指针p给变量ch读入字符的scanf函数调用语句是。
}
void test(int x,int *y)
{
int t;
t=x;x=*y;*y=t;
}
【15】#define PRINTA printf("%d,%d\n",a,b);
#define PRINTB printf("%d,%d\n",*pa,*pb);
void swap(int *p,int *q)
{
int a=89,b=10,*c;
c=&a;
opr(a,b,c);
printf("%d,%d,%d",a,b,*c);
}
【19】main()
{
int **k,*a,b=100;
a=&b;k=&a;
printf("%d\n",**k);
}
【20】fun1(int x,int y,int *cp,int *dp)
{ printf(%d\n”,++*x); }
main( )
{ int a=25;
fun (&a);
}
【7】以下程序的输出结果是( )。
A.6B.7C. 8D. 9
main()
{
int k=2,m=4,n=6;
int *pk=&k,*pm=&m,*p;
*(p=&n)=*pk*(*pm);
printf("%d\n",n);
a='A';b='B';sub1(&a,b);putchar(a);putchar(b);
}
【18】void exc(int *i,int *j)
{
int k;
k=*i;*i=*j;*j=k;
}
void opr(int x,int y,int *z)
{
exc(&x,&y);*z=x%y;
}
main()
【4】若有定义:int x,*pb;则正确的赋值表达式是( )。
A.pb=&xB.pb=xC.*pb=&xD.*pb=*x
【5】对于类型相同的指针变量,不能进行的运算是( )。
A.<B. =C. +D.–
【6】以下程序的输出结果是( )。
A.23B.24C. 25D. 26
Void fun ( int *x)
main()
{
char a[]="123456789",*p;
int i=0;
p=a;
while(*p)
{
if(i%2==0) *p='*';
p++;i++;
}
puts(a);}【2 Nhomakorabea】main()
{
int x[]={0,1,2,3,4,5,6,7,8,9};
int s,i,*p;
s=0;
p=&x[0];
{
int t;
t=*p;*p=*q;*q=t;
}
main( )
{
int a=1,b=2,*pa=&a,*pb=&b;
PRINTA
PRINTB
swap(pa,pb);
PRINTA
PRINTB
}
【16】main()
{
int a[]={1,2,3,4,5,6,7,8,9};
int *p=a,i,t;
for(i=0;i<9/2;i++)
{
*cp=x*y;
*dp=x%y;
}
main()
{
int a,b,c,d;
a=2;b=3;
ast(a,b,&c,&d);
printf("%d,%d\n",c,d);
}
【10】以下程序的输出结果是( )。
A.1,3B. 2,3C. 1,6D.2,6
main()
{
int a[]={1,2,3,4,5,6},*p;
{
int *p;
*p=*p1; *p1=*p2;*p2=*p;
}
【12】void add (int a,int b,int c)
{ c=a+b;
return c;
}
main( )
{ int *ap,*bp,a,b,c;
ap=&a,bp=&b;
scanf(“%d %d”,&ap,&bp);
add(ap,bp,c);
main()
{
int x=9,y=5,*px=&x,*py=&y;
fun(px,py);
printf("%d,%d\n",x,y);
}
【23】sub(float x,float *y,float *z)
{
*y=*y-1.0;
*z=*z+x;
}
main()
{
float a=2.5,b=9.0,*pa,*pb;
p=a;
*(p+3)+=2;
printf("%d,%d\n",*p,*(p+3));
}
三、改错题
【11】main( )
{int a=1,b=2;
printf(“a=%db=%d\n”,a,b);
swap(a,b);
printf(“a=%d b=%d\n”,*a,*b);
}
swap ( int *p1, int *p2)
{
*cp=x+y;*dp=x-y;
}
fun2(int *a,int b)
{
int c;
c=*a;*a=b;b=c;
}
main()
{
int a,b,c,d;
a=30;b=50;
fun1(a,b,&c,&d);
fun2(&c,d);
printf("%d,%d\n",c,d);
}
【21】void sub(int x,int y,int *z)
printf("%c",*(p1+k));
}
【25】main()
{
int i,k;
for(i=0;i<4;i++)
{
k=sub(&i);
printf("%3d",k);
}
printf("\n");
}
sub(int *s)
{
static int t=0;
t=*s+t;
}
【26】#include "stdio.h"
(4) 通过指针p给变量ch赋字符A的语句是。
(5)通过指针p输出ch中字符的语句是。
(6)在16位微机上,指针变量p在内存中所占字节数是,变量ch在内在所占字节数是。
二、选择题
【3】若有说明:int i,j=7,*p=&i;则与i=j;等价的语句是()。
A.i=*p; B.*p=*&j; C.i=&j; D.i=**p;
for(i=1;i<10;i+=2)
s+=*(p+i);
printf("sum=%d",s);
}
五、编程题
【28】编写一个使用指针的C函数,交换数组a和数组b中对应元素。
【29】编写函数,通过指针连接两个字符串。
【30】产生动态数组。编写程序,输入数组大小后,通过动态分配内存函数malloc产生数组。
{*z=y-x;}
main()
{
int a,b,c;
sub(20,15,&a);
sub(a,9,&b);
sub(a,b,&c);
printf("%d,%d,%d\n",a,b,c);
}
【22】fun(int *a,int *b)
{
int *w;
*a=*a+*a;
*w=*a;
*a=*b;
*b=*w;
}
}
【8】以下程序的输出结果是( )。
A.100B.50C. 101D.200
main()
{
int *v,b;
v=&b;
b=100;
*v+=b;
printf("%d\n",b);
}
【9】以下程序的输出结果是( )。
A.2,3B. 6,2C. 3,2D. 2,6
相关文档
最新文档