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章指针
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
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章 指针结构体与预处理命令
指针使用示例 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语言第八章 数组课件
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数组
达数组中打头元素旳地址
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语言程序设计》实验报告实验名称:数组名作为函数的参数系别: 计算机系专业:计算机科学与技术班级:五班姓名: 学号:实验日期:教师审批签字:实验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语言知识点列表
附知识点列表: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的使用以及循环的嵌套。
c语言自定义函数参数为指定长度的数组
自定义函数参数为指定长度的数组在C语言中,自定义函数参数为指定长度的数组是一种非常常见的情况。
我们知道,数组是一种非常重要的数据类型,在实际编程中经常会用到。
而在定义函数时,有时候我们需要将一个指定长度的数组作为参数传入函数中进行处理。
接下来,我们就来深入探讨一下自定义函数参数为指定长度的数组这个主题。
1. 数组和函数让我们简单回顾一下数组和函数的基本知识。
数组是一组相同类型的数据元素的集合,而函数是一段封装好的代码块,我们可以通过调用函数来执行其中的代码。
在C语言中,我们可以定义一个接受数组作为参数的函数,然后在函数中对数组进行处理。
2. 自定义函数参数为指定长度的数组接下来,让我们来看看如何定义一个函数,其参数为指定长度的数组。
在C语言中,我们可以使用以下语法来定义这样的函数:void myFunction(int arr[], int length) {// 函数代码...}在这个例子中,myFunction 是我们自定义的函数名,int arr[] 表示这个函数接受一个整型数组作为参数,int length 则表示数组的长度。
通过这种方式,我们就可以在函数中使用指定长度的数组进行操作了。
3. 如何使用自定义函数参数为指定长度的数组那么,在实际编程中,我们应该如何使用这种类型的函数呢?假设我们有一个长度为5的整型数组,并且我们想对其中的元素进行求和。
我们可以这样调用上面定义的函数:int myArray[5] = {1, 2, 3, 4, 5};myFunction(myArray, 5);在这个例子中,我们将 myArray 数组和它的长度 5 作为参数传入 myFunction 函数中。
这样,我们就可以在 myFunction 函数中对数组进行处理了。
4. 个人观点和理解对于自定义函数参数为指定长度的数组,我个人认为这是一种非常灵活和有效的编程方式。
通过将数组的长度作为参数传入函数中,我们可以更好地控制函数对数组的处理,使代码更加清晰和易读。
C程序设计教案262课时——数组作为函数参数
教案在In中♦用“打擂台”算法,依次将数组元素a[1]到a[9]与m比较,最后得到的m值就是10个数中的最大者#inc1ude<stdio.h>intmain(){intmax(intx,inty);inta[10],m,n,i;printf("10integernumbers:∖n,z);for(i=0;i<10;i++)SCanf("%d",&a[i]);printf("∖n");for(i=1,m=a[0],n=0;i<10;i++){if(max(m,a[i])>m){m=max(m,a[i]);n=i;))printf(a1argestnumberis%d∖n”,m);printf(u%dthnumber,∖n",n+1);)>7.7.2数组名作函数参数>除了可以用数组元素作为函数参数外,还可以用数组名作函数参数(包括实参和形参) >用数组元素作实参时,向形参变量传递的是数组元素的值>用数组名作函数实参时,向形参传递的是数组首元素的地址>7.7.2数组名作函数参数例7.10有一个一维数组score,内放10个学生成绩,求平均成绩。
A解题思路:♦用函数average求平均成绩,用数组名作为函数实参,形参也用数组名♦在average函数中引用各数组元素,求平均成绩并返回main函数Jtinc1ude<stdio.h>intmain(){f1oataverage(f1oatarray[10]);f1oatscore[10],aver;inti;printf(z,input10scores:∖n,z);for(i=0;i<10;i++)scanf("%f”,&score[i]);Printf("∖n");aver=average(score);printf(z,%5.2f∖n*,aver);return0;)f1oataverage(f1oatarray[10]){inti;f1oataver,sum=array[0];for(i=1;i<10;i++)sum=sum+array[i];aver=sum∕10;return(aver);)例7.11有两个班级,分别有35名和30名学生,调用一个average函数,分别求这两个班的学生的平均成绩。
第8章 结构体_教学设计
(1)由基本数据类型引出结构体类型概念
教师在讲解结构体时,简单回顾数据类型中的分类。让学生了解到结构体类型是数据类型的一种。对结构体出现的意义进行简单讲解。
(2)进入主题,逐项讲解以下内容
教师讲解结构体类型的声明ຫໍສະໝຸດ 定义教师讲解结构体变量的大小
教师讲解结构体的初始化、访问
(3)教师对结构体类型的初始化、结构体变量访问进行讲解
教师在讲解结构体初始化、结构体变量的访问时结合Dev-C++开发工具进行讲解。
三、归纳总结,布置课后作业
(1)回顾上课前的学习目标,对本节课知识点进行总结。
提问讲解的知识点,对存在问题进行讲解。带领学生总结本课内容:结构体类型的声明、结构体类型定义、结构体类型大小、结构类型的初始化、结构体类型的访问。本课时内容要求学生掌握,对提问后存在的问题及时解决。
(2)使用课后习题作为课后作业。
第二课时
(结构体数组)
一、构造情境,导入结构体数组的概念
(1)由日常生活工作学习结构体数组概念
教师在讲结构体数组时,类比生活中的示例引出结构体数组的概念。比如存储一个班学生的年龄、成绩等信息。
(2)进入主题,逐项讲解以下内容
教师讲解结构体数组的定义
教师讲解结构体数组的初始化与访问
(2)教师对结构体数组作为函数参数进行讲解
教师在讲解结构体数组作为函数参数时,结合使用Dev-C++开发工具进行讲解,编写简单的程序进行实际操作。
(3)教师对结构体指针作为函数参数进行讲解
教师在讲解结构体指针作为函数参数时,结合使用Dev-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
【语法】初始化指针变量的一般形式如下:
基类型 *指针变量名 = 内存地址 ;
程 序 设
计
基
础
【语
义
】定
四川大学《c语言程序设计》课件-第8章 结构体与共用体
90 83 72 82
2 林平之
男 1999
78 92 88 78
3 岳灵珊
女 1999
89 72 98 66
4 任盈盈
女 1999
78 95 87 90
结构体的解决方法
struct STUDENT
{ int studentID;
/*每个学生的序号*/
char studentName[10];/*每个学生的姓名*/
};
结构体变量的指针
struct STUDENT
{
int
studentID;
char
studentName[10];
char
studentSex[4];
struct date timeOfEnter;
int
scoreComputer;
int
scoreEnglish;
int
scoreMath;
int
结构体的内存占用
double 占用内存字节数 = 8 struct 类型用内存字节数 = ? 是所有成员变量的内存总和吗?
用运算符sizeof获得结构体大小 sizeof(变量或表达式) sizeof(类型)
struct number
{ short i; char ch;
float f;
};
printf("%d\n", sizeof(struct number));
struct STUDENT *pStu; /*定义结构体指针*/
pStu = &stu;
通过stu和成员运算符访问结构体成员
– stu. studentID = 1;
通过pStu和指向运算符访问结构体成员
C语言程序设计教程第8章北京邮电大学出版社.
第8章 指针
18
说明: 对于不同基类型的指针,指针变量“加上” 或“减去”一个整数n所移动的字节数(= sizeof( 指针所指对象的数据类型 ) )是不同的。 例如: float a[10], *p=a, *x; x=p+3; /*实际上是p加上3*4个字节赋给x, x依然指向数组的第三个分量*/
C语言程序设计教程
第 8 章 指针
8.1 8.2 8.3 8.4 8.5 8.6 指针与指针变量 指针与函数 指针与数组 指针与字符串 指针数组与命令行参数 程序举例
第8章 指针
2
8.1 指针与指针变量
8.1.1 指针的概念
1.内存与变量地址 内存地址:内存是计算机用于存储数据的存储 器,以一个字节作为存储单元,为了便于访问,给 每个字节单元一个唯一的编号,第一字节单元编号 为0,以后各单元按顺序连续编号,这些单元编号 称为内存单元的地址 。 变量地址:变量所分配存储空间的首字节单元 地址(字节单元编号)。
2018/9/14
C语言程序设计教程
第8章 指针
3
在程序中,对变量的操作实际上是通过地址来完成的。 • 定义时:定义变量→分配内存单元(按类型)→地址 (即内存中的编号) • 存取操作:程序 →变量名 →内存单元 →存取 • 实际上: 程序 →编译 →变量名 →变量的地址
2.访问方式
直接存取:把直接按变量名或地址存取变量值的方式 称为 “直接存取”方式。
2018/9/14
C语言程序设计教程
第8章 指针
10
8.1.3 指针运算
指针运算实际上是地址的计算,包括赋值运算、算术运算、 关系运算三种。
1. 指针的赋值运算 (1)将变量地址值赋给指针变量,使指针指向该变 量。
第八章 函数1函数概述
第八章函数8、1 函数概述1、C语言的函数:C语言的函数是子程序的总称,包括函数和过程。
(有返回值、无返回值,教材中称为:有返回值函数,无返回值函数)。
C语言函数可以分为库函数、用户自定义函数。
库函数由系统提供,程序员只需要使用(调用),用户自定义函数需要程序员自己编制。
2、C语言的程序由函数组成,函数是C语言程序的基本单位。
前面章节介绍的所有程序都是由一个主函数main组成的。
程序的所有操作都在主函数中完成。
事实上,C语言程序可以包含一个main函数,也可以包含一个main函数和若干个其它函数。
C语言程序的结构如图所示。
在每个程序中,主函数main是必须的,它是所有程序的执行起点,main函数只调用其它函数,不能为其它函数调用。
如果不考虑函数的功能和逻辑,其它函数没有主从关系,可以相互调用。
所有函数都可以调用库函数。
程序的总体功能通过函数的调用来实现。
3、使用函数的意义(补充)有些同学提出,我只用一个main函数就可以编程,为什么这么复杂,还要将程序分解到函数,还要掌握这么多概念,太麻烦了?我们说对于小程序可以这样做,但是对于一个有一定规模的程序这样做就不合适了。
使用函数的几个原因:(1)使用函数可以控制任务的规模一般应用程序都具有较大的规模。
例如:一个齿轮误差分析软件系统的源程序行数要数千行。
一个传动链计算机辅助设计系统的源程序行数5万多行。
使用函数可以将程序划分为若干功能相对独立的模块,这些模块还可以再划分为更小的模块,直到各个模块达到程序员所能够控制的规模。
然后程序员再进行各个模块的编制。
因为各个模块功能相对独立,步骤有限,所以流程容易控制,程序容易编制,修改。
一般一个模块的规模控制在源程序60行以内(但是也不必教条化)。
(2)使用函数可以控制变量的作用范围变量在整个模块范围内全局有效,如果将一个程序全部写在main()函数内,大家可以想象,变量可以在main函数内任何位置不加控制地被修改。
c语言第八章 函数
教学进程
8.2
函数的调用
【练习题 】
用函数实现求两个实数的和。
#include <stdio.h> void main() /*主调函数*/ { float add(float x, float y); /*函数声明*/ float a,b,c; printf("Please enter a and b:"); scanf("%f,%f",&a,&b); c=add(a,b); 因函数声明与函数首 printf("sum is %f\n",c); 部一致,故把函数声 } 明称为函数原型。 float add(float x,float y) /*被调函数首部*/ { float z; z=x+y; 用函数原型来声明函数,能减少 return(z); 编写程序时可能出现的错误。 }
教学进程
8.2.3 函数的调用
定义函数时,函数名后括号中的变量称为形式参数,即形参。 定义函数时,函数名后括号中的变量称为形式参数,即形参。 在主函数中调用函数时,函数名后括号中的表达式称为实际 参数,简称实参。
【例 】 输入两个整数,要求用一个函数求出其中的大者,并 在主函数中输出此数。
教学进程
a
b
c
d
e
f
教学进程
运行结果: 【例】 函数调用的简单例子。
**************** How do you do! ****************
/*主调函数*/ /*主调函数* #include <stdio.h> void main() { void printstar(); printstar(); void print_message(); print_message(); printstar(); print_message(); printstar(); }
《c语言程序设计教学资料》第8章---数组
一维数组的初始化
不为自动数组初始化,数组中的元素值是不确定的 不为静态或外部数组初始化,则对数值型数组元素, 初值为0,而对字符型数组元素,初值为空字符 ‘\0’ 对数组元素初始化的实现方法:
1.在定义数组时对数组元素赋以初值。
例如: int a[10]={0,1,2,3,4,5,6,7,8,9}; 将数组元素的初值依次放在一对花括弧内。经过上 面的定义和初始化之后,a[0]=0,a[1]=1,a[2]=2, a[3]=3,a[4]=4,a[5]=5,a[6]=6,a[7]=7,a[8]=8, a[9]=9。
0
30
b1]
1
34
b[2]
2
38
b[3]
3
3c
b[4]
4
40
c
52
44
a
61
48
i
14678910235
4c
b[8]
8
50
b[9]
9
54
b[10]
10
58
c和a的值因数组越界编辑p而pt 被破坏了 b[11]
11
5c
二维数组程序举例
例: 将一个二维数组行和列元素互换,存到另一个二维数 组中。
数组名 [下标] 下标可以是整型常量或整型表达式。例如: a[0]=a[5]+a[7]-a[2*3]
注意
定义数组时用到的“数组名[常量表达式]” 和引用数 组元素时用到的“数组名[下标]” 是有区别的。 例如∶ int a[10]; // 定义数组长度为10
t=a[6]; //引用a数组中序号为6的元素
sizeof(数组名)
编辑ppt
C语言程序设计第八章 指针的使用
第八章指针的使用【学习目标】本章将详细介绍在C语言中如何使用指针。
学习要点包括如下几点:(1)掌握指针和指针变量的概念,了解指针变量的特点以及直接访问数据和间接访问数据的原理。
(2)掌握指针变量的定义、赋值方法及指针运算符的使用,熟练运用指针访问简单变量。
(3)熟悉指针和一维数组的关系,掌握指向一维数组的指针变量的定义方法,熟练使用指针变量访问一维数组元素。
(4)了解指针与字符串的关系,能熟练使用指针处理字符串。
(5)熟练掌握用指针变量作函数的参数时函数的定义和调用方法、数组名作函数的参数用法。
(6)指向指针的指针的运用。
【学习导航】本章的在整个课程中的位置如图5-1所示。
图8-1 本章学习导航在本书的第一章介绍C语言有一个灵活性的特点,那么它的灵活性具体体现在哪里呢?其实就是指针。
指针是C语言的精华部分,通过利用指针,我们能很好地利用内存资源,使其发挥最大的效率。
有了指针技术,我们可以描述复杂的数据结构,对字符串的处理可以更灵活,对数组的处理更方便,使程序的书写简洁,高效。
8.1 地址和指针指针是C语言的一种数据类型,类似于整型、字符型等。
既然指针也是一种类型,那么也可以定义该类型的变量,称为指针变量。
指针变量和其他类型的变量的区别是:指针变量存储的是地址。
所以要学好指针,就一定要明白数据在内存中是如何存储的。
计算机所有数据都是存储在存储器里,系统的内存可看作编了号的小房间,如果要取房间的东西(读取数据)就需要得到房间编号。
地址就是内存区中对每个字节的编号。
下面通过两个整型变量来说明。
整型变量x、y(基本整型需4个字节)在内存中的存储如图8-2所示(假设内存编号是从2000开始)。
把变量所占用的存储单元首字节的地址作为变量的地址。
C语言中利用取地址运算符“&”获取变量的存储地址。
例如,&c将返回c的首地址;&x将返回x的首地址。
2000H2004H2008H2012H...图8-2 变量x和y在内存中的存储图8-2中2000H和2004H就是内存单元的地址。
C语言 第八章 结构体
共用体
3)直接定义联合变量 union {
int i;
float f; }num; 说明:(1)共用体变量的所有成员占有同一段内存,所占内存空 间是其成员中字节数最大的成员占有的字节数。
(2)共用体变量中可以定义许多不同类型的成员,但同一时刻只
有一个成员的数据有效。
共用体
4.共用体变量初始化 初始化时,只能对第一个成员的数据类型初始化。 例:union data num={10}; 正确 union data num={10,25.4}; 错误
结构体变量
方法三:定义结构体类型的同时定义结构体变量,省略结构体类型名
struct DATE{ int year; int month; int day;}; struct {
long int number;
char name[8]; int age;
char *sex;
struct DATE birthday; }stu1,stu2;
数据类型
数据类型
成员名1;
成员名2;
//成员表
……
};
结构体类型
2.结构体类型的定义: 说明: (1) struct是关键字,标识一个结构体类型定义的开头 (2)“结构体类型名”是表示该结构体类型的名称的标识符,可
类比int、char
(3)“成员表”是构成结构体类型的成份,由一个或多个成员构
成,每个成员有自己的成员名。各成员数据类型可以不同,既可以
枚举类型
3.枚举变量定义
方式一:类型和变量分开定义 enum WEEKDAY{Sun,Mon,Tue,Wed,Thu,Fri,Sat};//定义枚举类型 enum WEEKDAY w;//定义枚举变量w
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 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; }
}
二维数组做函数参数
• 在调用函数时,如果被调函数的形参是二维数组,