C语言,第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;}}}}。

《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数组做函数参数

c数组做函数参数

c数组做函数参数
在C语言中,数组作为函数参数时,实际上传递的是数组的首地址。

所以,当我们把数组作为函数参数时,我们传递的是数组的地址,而不是数组的每个元素。

下面是一个简单的示例,演示了如何将数组作为函数参数:
```c
include <>
// 函数声明
void printArray(int arr[], int size);
int main() {
int arr[5] = {1, 2, 3, 4, 5};
int size = sizeof(arr) / sizeof(arr[0]);
// 调用函数,传递数组和数组大小
printArray(arr, size);
return 0;
}
// 函数定义
void printArray(int arr[], int size) {
for (int i = 0; i < size; i++) {
printf("%d ", arr[i]);
}
printf("\n");
}
```
在这个示例中,我们定义了一个名为 `printArray` 的函数,该函数接受一个整数数组和数组的大小作为参数。

在 `main` 函数中,我们创建了一个整数数组 `arr`,并计算了数组的大小。

然后,我们调用 `printArray` 函数,并将数组和数组大小作为参数传递给它。

在 `printArray` 函数中,我们遍历数组并打印每个元素的值。

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语言第八章 数组课件

高中信息技术 信息学奥赛C语言第八章 数组课件
• 一维数组初始化的定义形式为: 类型名 数组名[常量表达式或省略]={值0,值 1,……}; 其中,{}中各值是对应的数组元素初值,各值 之间用逗号隔开。例如:
int a[5]={0,1,2,3,4}; 也可以省略为:
int a[ ]={0,1,2,3,4};
说明:
1.可以只给部分数组元素赋初值。当{}中 值的个数少于数组元素个数时,则表示初 值只赋于数组开始的若干个元素,余下部 分元素为相应类型的缺省值,int为整型数0, 字符型为空格等。
二维数组存储结构是“按行存放,先行后列”,
说明:
(1)数组名是用户定义标识符
(2)数组名后面的两对方括号必不可少, 之间不能有空格。方括号中必须是常量表 达式,表达式1表示数组的行数,表达式2 表示数组的列数。其中必须是正的整型常 量,绝对不能是变量。
(3)定义后,a数组在内存中占用6个连续 的存储单元,按照行的顺序依次存储各个 元素。 见书p75图8-2、图8-3.
8.数组定义中,数组长度除多数情况下作显式说明 外,有两种情况下不必或不能用长度说明,而用[] 代替。
(1)给数组全体元素赋初值时,可省去数组长度说 明。
(2)数组名作为函数的参数,在函数的参数说明部 分,当指出参数是数组时,不能用长度说明。
二、一维数组的初始化
• 当系统为所定义的数组在内存中开辟一串连续的 存储单元时,这些存储单元中并没有确定的值,数 组的初始化就是指在定义数组时给数组元素赋初值。
为一维数组。 • 一维数组的定义方式为:
类型名 数组名[常量表达式]; 例如: int array[10];
它表示定义了一个名为array的数组, 此数组有10个元素,每个元素的数据类型 为整型。
一维数组定义的说明:

C语言程序设计ppt数组

C语言程序设计ppt数组
存储类型阐明符:extern、static 类型修饰符:const、volatile 数组名:是一种标识符,是一种地址常量,用以表
达数组中打头元素旳地址
2024/10/10
6
8.2.1 一维数组旳申明
例8.1 具有基本数据类型旳一维数组旳申明
#define SIZE 10 int array[5]; double d[5],e[SIZE]; char name[SIZE*5];
13. double even;
21. course_even[i]=course_su
/*分别为全部课程旳总分、平均分 m[i]/5.0;
*/
22. sum+=course_sum[i];
14. int i;
23.
} /* 计算各门课平总分 */
24. even=sum/(3.0*SIZE);
2024/10/10
2024/10/10
17
例8.10
8. int course_sum[3]={0,0,0}; 15. for(i=0;i<5;i++){
9. double course_even[3];
16. course_sum[0]+=math[i];
/组**分/ 别为各门课程总分、平均分数17. course_sum[1]+=physics[i];
用若干个数字序号(下标)来区别各数组元素
例如定义float score[30],可表述30位学生成绩 用数组具有什么好处?
2024/10/10
3
8.1 数组概述
问题
计算全班30位同学某门课程旳平均成绩
处理措施
设置30个float型变量来统计成绩 设置一种有30个float型元素旳数组来统计成绩

《C语言程序设计》数组名作为函数的参数

《C语言程序设计》数组名作为函数的参数

《C语言程序设计》实验报告实验名称:数组名作为函数的参数系别: 计算机系专业:计算机科学与技术班级:五班姓名: 学号:实验日期:教师审批签字:实验8 数组名作为函数的参数⒈实验目的⑴掌握数组名作为函数参数的基本使用方式。

⑵掌握与数组有关的算法(特别是排序算法)。

⒉实验内容或实验题目编程题目:(题目⑴、题目⑵为一组,题目⑶为一组。

每个同学每组都必须完成1题)要求:每道题目分别书写程序,试运行(如何输入,结果如何)。

题目⑴:编写函数实现将数组元素按从小到大的顺序排序,主函数从键盘输入10个整数存入数组,调用函数后输出数组的元素。

题目⑵:用数组名作为函数参数,编写一个比较两个字符串s和t大小的函数strcomp(s,t),要求s小于t时返回-1,s等于t•时返回0,s大于t时返回1。

在主函数中任意输入4个字符串,利用该函数求最小字符串。

题目⑶:输入6×6的数组,下面的各要求通过编写函数实现,要求用数组名作为函数参数:①求出对角线上各元素的和;②求出对角线上行、列下标均为偶数的各元素的积;③找出对角线上其值最大的元素和它在数组中的位置。

⒊算法说明(用文字或流程图说明。

)题目1:⒋程序清单题目⑴:#include <stdio.h>main(){int i,j,t,n=10,a[10];printf("Please enter ten numbers:\n"); for(i=0;i<n;i++){scanf("%d",&a[i]);}for(i=0;i<n-1;i++){for(j=i+1;j<n;j++)if(a[i] > a[j]){t = a[j];a[j] = a[i];a[i] = t;}}for(i=0;i<n;i++)printf("%d\n",a[i]);}题目⑶:#include <stdio.h>main(){int c,b,i,j,n=6,d=1,max,sum=0,a[6][6];for(i=0;i<n;i++){for(j=0;j<n;j++){scanf("%d",&a[i][j]);}}max=a[0][0];for(i=0;i<n;i++){for(j=0;j<n;j++){if(i==j||i+j==5)sum+=a[i][j];if((i==j||i+j==5) && i%2==0 && j%2==0)d*=a[i][j];if((i==j||i+j==5) && a[i][j]>max){max=a[i][j];b=i;c=j;}}}printf("和为%d\n积为%d\n",sum,d);printf("对角线上最大的元素为%d\n它在数组中的位置为a[%d][%d]\n",max,b,c);}⒌运行结果(包括原始数据、相应的运行结果和必要的说明。

C语言知识点列表

C语言知识点列表

附知识点列表:1.C语言概述本章主要介绍了C语言的特点、基本结构、基本输入输出语句和C程序的编辑、编译、运行方法,要求了解C语言的特点,掌握C程序的基本结构,熟悉C程序的编辑、编译、调试和运行过程。

1.1 C 语言出现的历史背景1.2 C 语言的特点1.3 简单的C 程序介绍1.4 C 程序的上机步骤2.程序的灵魂——算法本章主要讲了关于算法的一些问题。

要求大家了解算法的概念、表示和特性。

2.1 算法的概念2.2 简单算法举例2.3 算法的特性2.4 怎样表示一个算法2.5 结构化程序设计方法3.数据类型、运算符与表达式本章主要介绍了C语言的基本数据类型、各种运算符、以及运算符的功能、结合性和优先级。

要求掌握含有这些运算符的表达式值的判定,并且在编程中熟练运用这些运算符解决问题。

3.1 C的数据类型3.2 常量与变量3.3 整型数据3.4 实型数据3.5 字符型数据3.6 变量赋初值3.7 各类数值型数据间的混合运算3.8 算术运算符和算术表达式3.9 赋值运算符和赋值表达3.10 逗号运算符和逗号表达式4.最简单的C 程序设计--顺序程序设计本章主要讲了C语言基本输入输出语句和顺序程序设计的一般方法。

要求大家掌握赋值语句、putchar函数、getchar函数、printf函数、scanf函数和顺序程序的结构。

4.1 C 语句概述4.2 赋值语句4.3 数据输入输出的概念及在C语言中的实现4.4 字符数据的输入输出4.5 格式输入与输出4.6 顺序结构程序设计举例5.选择结构程序设计本章主要介绍了C语言提供的选择结构语句:if语句、if-else语句和switch语句。

要求大家掌握并熟练使用if语句的和switch语句。

5.1 关系运算符和关系表达式5.2 逻辑运算符和逻辑表达式5.3 if 语句5.4 switch 语句6.循环结构程序设计本章主要介绍了C语言提供的三种循环结构语句:while语句、do-while语句和for语句,介绍了循环结构中常用的语句break、continue的使用以及循环的嵌套。

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

for (i=0; i<n; i++) { sum = sum + a[i]; }
return (float)sum/n; }
程序举例
P244.C 程序的功能是:从键盘分别读入5个数到arrA 中、8个数至arrB中,再读入一个欲查找的数searchVal ,然后分别调用自定义函数在数组arrA和arrB中查找 searchVal所在位臵的下标(不考虑在数组中存在多个 searchVal的情况)、输出查找结果。
函数的调用
要让计算机执行一个函数,就必须对函数进行调用。 说明:

调用库函数,需要在源程序最前面通过include预编译指令


引入对应库函数的头文件 调用库函数的关键是遵守函数原型定义的约定 • 使用正确的函数名 • 传递的实参在数量,类型和顺序必须和形参一致 • 如果有函数值,注意返回值的类型 函数可以嵌套调用,递归调用,但是不能循环调用。
}
}
变量的作用域(局部变量和全局变量)
1. 局部变量
局部变量:在一个函
#include <stdio.h> int max( int x, int y ); int main(void) { int a, b, c; scanf(“%d,%d”,&a,&b); c=max(a,b); printf(“max=%d\n”,c); return 0; } int max( int x, int y ) { int z; if(x>y) z=x; else z=y; return(z); }
int search(int a[], int n, int m) { int weizhi = -1, i;
for (i=0; i<n; i++) { if (a[i] == m) { weizhi = i; break; } } }
return weizhi;
程序举例
P817.C 程序的功能是:从键盘输入一行可带空格的 字符串(约定:字符数≤127字节),调用函数将该字 符串逆序存放,然后输出该字符串。
int b,c;
…… } }
int b,c;
……
2. 全局变量
全局变量:一个源文件可以包括一个或若干个函数。在函
数内部定义的变量是局部变量,在函数之外定
义的变量称为外部变量。也称全局变量或全程 变量。 全局变量可以为本文件中的其它函数所共用,其有效 范围为从定义变量的位置开始到本源文件结束。
例如: int p=1,q=5; float f1(int a) { int b,c; …… } char c1,c2; char f2(int x,int y) { int i,j; …… } main() { int m,n; …… }
程序举例
P823.C 程序的功能是:将m(2<=m<=20)行m列的二 维数组arrayA中的最后一行放到二维数组arrayB的第0 列中,把二维数组arrayA中的第0行放到二维数组 arrayB的最后一列中,二维数组arrayB中的其他数据 和arrayA一致。
void zh(int a[20][20], int b[20][20], int n) { int i, j; for (i=0; i<n; i++) { for (j=0; j<n; j++) { b[i][j] = a[i][j]; } } for (i=0; i<n; i++) { b[i][n-1] = a[0][i]; b[i][0] = a[n-1][i];• 在数中对形参数组定义时,可以省略数组
的大小说明。例如, int arr[ ]
程序举例
P241.C 程序的功能是:从键盘分别读入5个数到arrA 中、8个数至arrB中,然后分别调用自定义函数输出 数组arrA和arrB的各元素。
void printArray(int a[], int n) { int i;
变量的存储类别 一、动态存储方式与静态存储方式
⒈ 从变量的作用域(空间)角度分: 全局变量和局部变量 ⒉ 从变量存在的时间(生存期)来分: 静态存储方式和动态存储方式 ⒊ 静态存储方式 定义:在程序运行期间分配固定存储空间的方式。
⒋ 动态存储方式
定义:在程序运行期间根据需要进行动态分配存储空 间的方式。即:在函数调用时开始分配动态存储空间,函数 结束时释放这些空间。
⑴ 静态存储方式的数据: ☆ ☆ 全局变量 静态局部变量
特点:在程序编译时分配内存单元,在整个程序执行期间占
据固定存储单元,直到程序执行完毕才释放。 ⑵ 动态存储方式的数据: ☆ 自动变量 ☆ 函数的形式参数
☆ 函数调用时的现场保护和返回地址等。
特点:函数调用时分配动态存储空间,函数调用结束时释放
函数总结
1、实参与形参的个数相等,类型一致;
2、实参可以是变量、表达式、常数,实参必须有确
定的值;
3、在调用函数时,如果被调用函数的形参是变量,
实参和形参分别拥有各自的内存空间,实参将值传递
给对应的形参,形参值的改变不影响实参;
4、如果函数调用在前,函数定义在后,则在调用函
数前必须对函数进行原型声明。
程序举例
P818.C 程序的功能是:找出任意的一个m×n矩阵每 一行上的最大值的列下标并按示例格式要求显示。
void max(int a[N][N], int hang, int lie) { int i, j, maxvalue, maxlie; for (i=0; i<hang; i++) { maxvalue = a[i][0]; maxlie = 0; for (j=1; j<lie; j++) { if (a[i][j] > maxvalue) { maxvalue = a[i][j]; maxlie = j; } } printf("The max value in line %d is %d\n", i, maxlie); } }
如果在同一个源文件中,全局变量与局部变量同名,则在 局部变量的作用范围内,全局变量被“屏蔽”,即它不起作 用。 例 外部变量与局部变量同名。 #include <stdio.h> int a=3,b=5; int max(int a,int b) { 形参a、b的作 int c; c=a>b?a:b; 用范围 return(c); 全局变量a、b } 的作用范围 int main(void) { int a=8; 局部变量 printf(“max=%d”,max(a,b)); a的作用 return 0; 范围 }
则对应的实参是一个内存单元地址,实参数组和形
参数组共享一段内存。
• 在函数中对形参数组定义时,可以指定每一维的大
小,也可以省略第一维的大小说明,但不能只指定
第一维而省略第二维。例如:
int array[3][4]; int array[ ][10]; ( 正确!) int array[ ][ ]; int array[3][ ]; ( 错误!)
全局变 量c1,c2 的作用 范围
全局变 量p,q的 作用范 围
例如:
#include <stdio.h>
int a, b; void f1(void); int main(void) { a=2, b=4; f1( ); printf(“a=%d, b=%d\n”, a, b); return 0; } void f1(void) { int t1, t2; t1=a*2; t2=b*3; b=100; printf(“t1=%d, t2=%d\n”, t1, t2) }
for (i=0; i<n; i++) { printf("%d ", a[i]); }
}
程序举例
P243.C 程序的功能是:从键盘分别读入5个数到arrA 中、8个数至arrB中,然后分别调用自定义函数计算 数组arrA和arrB各元素的平均值、再输出平均值。
float average(int a[], int n) { int i, sum = 0;
数范围内部定义的变
量,称为局部变量。 它只在本函数范围内 有效,即:只有在本 函数内才能使用它们,
在此函数以外不能使
用这些变量。
几点说明: (1) 主函数main中定义的变量也只在主函数中有效。主函数也 不能使用其它函数中定义的变量。
(2) 不同函数中可以使用相同名字的变量,它们代表不同的对
象,互不干扰。 例如: float f1(int a) { char f2(int a, int y) {
例如:
对静态局部变量: static int a; (a=0) 对自动变量: int a; (a的值不确定)
static float b;
static char c;
(b=0.0)
(c=„\0‟)
float b;
char c;
(b的值不确定)
(c的值不确定)
递归算法 一、递归求n!
递归算法的两个必要条件:
(1)n的求解必然和前面n-1的求解,甚至n-2…的求解有联系,即是 和前一(或前几)层之间存在递归规律 (2)递归到前面的某一层一定有确定的返回值或结束继续递归
void nixu(char a[]) { int i, j; char tmp; for (i = 0, j = strlen(a) - 1; i < j; i++, j--) { tmp = a[i]; a[i] = a[j]; a[j] = tmp; }
}
二维数组做函数参数
• 在调用函数时,如果被调函数的形参是二维数组,
相关文档
最新文档