08_01_C语言程序设计_第八章 善于利用指针_周常欣

合集下载

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章 善于利用指针
下面都是合法的定义和初始化:
float *pointer_3; char *pointer_4; int a,b; int *pointer_1=&a,*pointer_2=&b;
pointer_3=2000; 错误 pointer_1=&a; *pointer_1=&a; 正确 错误 错误 pointer_3=&a;
8.2 指针变量
8.2.1使用指针变量的例子 8.2.2 怎样定义指针变量 8.2.3 怎样引用指针变量 8.2.4 指针变量作为函数参数
8.2.1使用指针变量的例子
例8.1 通过指针变量访问整型变量。 解题思路:先定义2个整型变量,再定 义2个指针变量,分别指向这两个整型 变量,通过访问指针变量,可以找到它 们所指向的变量,从而得到这些变量的 值。
5
9 5 9 y
}
5 9 x
如果想通过函数调用得到n个要改变的值:
① 在主调函数中设n个变量,用n个指针变量指 向它们 ② 设计一个函数,有n个指针形参。在这个函数 中改变这n个形参的值 ③ 在主调函数中调用这个函数,在调用时将这n 个指针变量作实参,将它们的地址传给该函数 的形参 ④ 在执行该函数的过程中,通过形参指针变量, 改变它们所指向的n个变量的值 ⑤主调函数中就可以使用这些改变了值的变量
50
*i_pointer=50;
将i的地址 存到这里
间接存取
i
直接存取
2000
3
间接存取
i_pointer
2000
*i_point值3送到变量中,可以有两 种表达方法: (1) 将3直接送到变量i所标识的单元中,例 如:i=3; (2) 将3送到变量i_pointer所指向的单元 (即变量i的存储单元),例如: *i_pointer=3; 其中*i_pointer表示 i_pointer指向的对象

11803_谭浩强《C程序设计》课件第8章PPT课件

11803_谭浩强《C程序设计》课件第8章PPT课件
03
如何处理文件读写错误?
2024/1/27
04
在进行文件读写操作时,需要判断返回值是否成功,如果 失败则需要使用perror()等函数输出错误信息。
05
如何实现文件的追加写入?
06
在使用fopen()函数打开文件时,使用追加模式"a"或"a+" 可以实现文件的追加写入。
29
拓展延伸:高级文件操作技术探讨
文本文件的读写操作
使用fscanf()、fprintf()等函数进行文 本文件的读写操作。
2024/1/27
文本文件的打开与关闭
使用fopen()函数打开文本文件,使 用fclose()函数关闭文本文件。
文本文件的定位与修改
使用fseek()、ftell()等函数进行文本 文件的定位与修改。
24
二进制文件操作实例
学习要求
认真听讲,理解文件操作的基本概念 和原理;多动手实践,通过编写程序 加深对文件操作的理解和掌握;注意 细节和规范,养成良好的编程习惯。
6
02
文件类型与指针
2024/1/27
7
标准文件类型
2024/1/27
文本文件
存储字符数据,每个字符对应一个ASCII码,Байду номын сангаас于阅读和编辑。
二进制文件
存储二进制数据,适用于非字符数据或需要高效存储和读取的场 景。
write
将指定的数据块写入到指定的文件描述符中(低级I/O函数)。
2024/1/27
14
04
随机访问文件内容
2024/1/27
15
文件定位函数
01
fseek()
用于设置文件位置指针,可以实 现在文件中的任意位置进行读写 操作。

精品课件-C程序设计(第三版)(荣政)-第8章

精品课件-C程序设计(第三版)(荣政)-第8章

第八章 指针
指针类型是对所有类型的指针的总称,指针的类型是指 针所指对象的数据类型。例如,pc是指向字符变量的指针, 简称字符指针。字符指针是基本类型的指针之一,除各种基 本类型之外,允许说明指向数组的指针、指向函数的指针、 指向结构体和共用体的指针以及指向各类指针的指针。在C 语言中只有指针被允许用来存放地址的值,其它类型的变量 只能存放该类型的数据。(很多书中用指针一词来指地址值, 或用指针变量来代表指针,阅读中应注意其具体含义。)
例8.2中指向整型的指针point在定义之后直接使用了,这 两条语句在编译时不会出现语法错误,但在使用时却几乎肯定 会出问题。表面上看,scanf()函数的参数要求给出的是地址, 而point的值就代表的是地址,但是point的值究竟是多少,也 就是说point究竟指向哪里,我们无法得知,在这种情况下就 对point指向的单元进行输入操作,将冲掉point指向的单元的 原有内容,假如这个单元是操作系统的所在处,就破坏了操作 系统,显然是一件危险的事。
为了理解指针的概念,程序员要有关于计算机如何在存储 器中存储信息的基本知识。以下简单地介绍个人计算机中存储 器存储的情况。
第八章 指针
个人计算机中CPU可以直接访问的,用来存储程序和数据 的记忆部件称为内存储器,内存储器由成千上万个顺序存储单 元组成,每个单元由一个惟一的地址标识。给定计算机的存储 器地址范围为从0到所安装的存储器数量的最大值。在计算机 上运行的每一个程序都要使用存储器。例如,操作系统要占用 一些计算机存储空间,每个应用程序也要占用计算机存储空间。 按照面向过程的结构化程序设计方法,程序代码和程序要处理 的数据是分开存储的,所以,一个程序在内存中要占两部分空 间:数据部分和指令代码部分。
第八章 指针

善于利用指针 PPT课件

善于利用指针 PPT课件

50

*i_pointer=50;
将i的地址 存到这里
间接存取
i
直接存取
2000
3
间接存取
i_pointer
2000
*i_pointer
3 2000
为了表示将数值3送到变量中,可以有两 种表达方法: (1) 将3直接送到变量i所标识的单元中,例 如:i=3; (2) 将3送到变量i_pointer所指向的单元 (即变量i的存储单元),例如: *i_pointer=3; 其中*i_pointer表示 i_pointer指向的对象
8.1 指针是什么
内存区的每一个字节有一个编号,这就是 “地址”,它相当于旅馆中的房间号。 在地址所标识的内存单元中存放数据,这相 当于旅馆房间中居住的旅客一样。 由于通过地址能找到所需的变量单元,我们 可以说,地址指向该变量单元。 将地址形象化地称为“指针”
务必弄清楚存储单元的地址和存储 单元的内容这两个概念的区别 例如:
指向就是通过地址来体现的
假设i_pointer中的值是变量i的地址 (2000),这样就在i_pointer和变量i之间 建立起一种联系,即通过i_pointer能知道i 的地址,从而找到变量i的内存单元
由于通过地址能找到所需的变量单元,因 此说,地址指向该变量单元
将地址形象化地称为“指针”。意思是通 过它能找到以它为地址的内存单元
#include <stdio.h> 此处*与类型名在一起。 此时共同定义指针变量 int main() { int a=100,b=10; int *pointer_1, *pointer_2; pointer_1=&a; pointer_2=&b; printf(“a=%d,b=%d\n”,a,b); printf(“*pointer_1=%d,*pointer_2= %d\n”,*pointer_1,*pointer_2); return 0; 此处*与指针变量一起使用。此 } 时代表指针变量所指向的变量

C程序设计第四版课件第8章善于利用指针

C程序设计第四版课件第8章善于利用指针

通过指针访问数组元素
使用指针访问数组元素
01
通过指针可以访问数组中的元素,即通过解引用指针来获取元
素的值。
指针的算术运算
02
可以通过对指针进行算术运算来访问数组中的相邻元素。
指向元素的指针变量
03
可以定义一个指向数组中某个元素的指针变量,通过该变量可
以访问该元素。
指针与字符串
1 2
字符串常量的指针
通过二级指针,可以方便地操 作二维数组和多维数组,实现 更加灵活的数据处理。
THANKS
感谢观看
指针的声明与初始化
声明指针变量时,需要在变量名前加 上星号(*)。
未初始化的指针变量可能指向任何位 置,因此使用前应确保指针已被正确 初始化。
初始化指针变量时,需要将其设置为 某个变量的地址。
指针的赋值与运算
可以将一个变量的地址赋值给指 针变量。
可以对指针进行加法或减法运算 ,以改变指针所指向的内存地址
指针数组可以用来存储多个变量 的地址,通过数组索引访问不同 的地址,实现动态内存分配和字
符串处理等功能。
例如,char *arr[10] 表示一个包 含10个字符指针的数组,每个指
针可以指向一个字符串。
二级指针
二级指针是指向指针的指针, 用于间接地访问和修改变量的 值。
二级指针在处理动态内存分配 、函数参数传递和多维数组等 场景中非常有用。
05
指针的高级应用
指向指针的指针
指向指针的指针是指一个指针变量,它存储的是另一个指针变量的地址,而不是变 量的值。
通过指向指针的指针,可以间接地访问和修改变量的值,增加了对内存地址操作的 灵活性。
指向指针的指针在处理动态内存分配、函数参数传递和多维数组等场景中非常有用 。

C语言 第8章 善于利用指针

C语言 第8章  善于利用指针

第8章善于利用指针指針是什么⏹如果在程序中定义了一个变量,在对程序进行编译时,系统就会给该变量分配内存单元⏹内存区的每一个字节有一个编号,这就是“地址”,它相当于旅馆中的房间号。

⏹在地址所标识的内存单元中存放数据,这相当于旅馆房间中居住的旅客一样。

⏹由于通过地址能找到所需的变量单元,我们可以说,地址指向该变量单元。

⏹将地址形象化地称为“指针”⏹务必弄清楚存储单元的地址和存储单元的内容这两个概念的区别指针变量2怎样定义指针变量⏹定义指针变量的一般形式为:类型*指针变量名;如:i n t*p o i n t e r_1,*p o i n t e r_2;•i n t是为指针变量指定的“基类型”•基类型指定指针变量可指向的变量类型•如p o i n t e r_1可以指向整型变量,但不能指向浮点型变量2怎样定义指针变量⏹下面都是合法的定义和初始化:f l o a t*p o i n t e r_3;c h a r*p o i n t e r_4;i n t a,b;i n t*p o i n t e r_1=&a,*p o i n t e r_2=&b;3怎样引用指针变量⏹在引用指针变量时,可能有三种情况:•给指针变量赋值。

如:p=&a;•引用指针变量指向的变量。

如有p=&a;*p=1;则执行p r i n t f(“%d”,*p);将输出1•引用指针变量的值。

如:p r i n t f(“%o”,p);3怎样引用指针变量⏹要熟练掌握两个有关的运算符:(1)&取地址运算符。

&a是变量a的地址(2)*指针运算符(“间接访问”运算符)如果:p指向变量a,则*p就代表a。

k=*p;(把a的值赋给k)*p=1;(把1赋给a)4指针变量作为函数参数通过指针引用数组1数组元素的指针⏹所谓数组元素的指针就是数组元素的地址⏹可以用一个指针变量指向一个数组元素i n t a[10]={1,3,5,7,9,11,13,15,17,19};i n t*p;p=&a[0];⏹在指针指向数组元素时,允许以下运算:•加一个整数(用+或+=),如p+1•减一个整数(用-或-=),如p-1•自加运算,如p++,++p•自减运算,如p--,--p•两个指针相减,如p1-p2(只有p1和p2都指向同一数组中的元素时才有意义)3通过指针引用数组元素⏹引用一个数组元素,可用下面两种方法:(1)下标法,如a[i]形式(2)指针法,如*(a+i)或*(p+i)其中a是数组名,p是指向数组元素的指针变量,其初值p=a 4用数组名作函数参数⏹用数组名作函数参数时,因为实参数组名代表该数组首元素的地址,形参应该是一个指针变量⏹C编译都是将形参数组名作为指针变量来处理的通过指针引用字符串1字符串的引用方式⏹字符串是存放在字符数组中的。

善于利用指针

善于利用指针

他变量地址的变量称为指针变量。
内存单元的地址与内存单元的内容是有区别 :假设程序中已定义了2个整型变量i、j, 即 int i , j; 则编译时系统将 2000和2003这四个 字节的内存空间 分配给给变量i; 2004~2007这4个字
内存地址 内存单元内容 变量名
2000 2001 2002 2003 2004 2005 2006 2007
#include <stdio.h> 此处*与类型名在一起。此 int main() 时共同定义指针变量 { int a=100,b=10; int *pointer_1 , *pointer_2; pointer_1=&a; pointer_2=&b; printf(“a=%d,b=%d\n”,a,b); printf(“*pointer_1=%d,*pointer_2= %d\n”, *pointer_1, *pointer_2); return 0; 此处*与指针变量一起使 用。此时代表指针变量所 }
内存地址 内存单元内容 变量名 2000 00 i 00 2001 00 2002
2003 2004 2005 2006 2007 2008 2009 2010 2011
03 00 00 00 06 00 00 00 09 内存单元和地址
j
k
这种直接按变量名存取变量值的方式称 为‚直接访问‛方式 。
指针变量,分别指向这两个整型变量,通过
访问指针变量,可以找到它们所指向的变量 ,从而得到这些变量的值。
#include <stdio.h> int main() { int a=100,b=10; 定义两个指针变量 int *pointer_1, *pointer_2; 使pointer_1指向a pointer_1=&a; 使pointer_2指向b 直接输出变量a和b的值 pointer_2=&b; printf(“a=%d,b=%d\n”,a,b); 间接输出变 printf(“*pointer_1=%d,*pointer_2= 量a和b的值 %d\n”,*pointer_1,*pointer_2); return 0; }
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

--:指针向低地址方向移动一个数据存储单元
注意:数据类型不同,指针增1和减1运算所引起的 地址变化量是不同的,指向的新地址为: 原地址 sizeof(类型说明符)
C
程 序 设 计 |
第 八 章
第八章 善于利用指针
(2)如p的初值是&a[0],则p+i和a+i就是数组元素a[i] 的地址,或者说,它们指向a数组序号为i的元素
C
程 序 设 计 |
第 八 章
第八章 善于利用指针
8.3.3 通过指针引用数组元素 引用一个数组元素,可以用两种方法: (1)下标法,如a[i]形式 (2)指针法,如*(a+i)或*(p+i)形式 其中a间数组名,p是指向数组元素的指针变量,其初始 值p=a (3)下标法示例 下 标 法
#include <stdio.h> int main() { int i; int a[10]={1,3,5,7,9,11,13,15,17,19}; for(i=0;i<10;i++) printf("%d\n",a[i]); return 0; }
C
程 序 设 计 |
第 八 章
第八章 善于利用指针
8.2 指针变量
8.2.1 使用指针变量的例子
#include<stdio.h> int main() { int a=100,b=10; //定义整型变量a,b,并初始化 int * pointer_1,* pointer_2; // 定义指向整型数据的两个指针 pointer_1=&a; //把变量a的地址赋给指针变量pointer_1 pointer_2=&b; //把变量b的地址赋给指针变量pointer_2 printf(“a=%d,b=%d\n”,a,b); //输出a和b的值 printf(“*pointer_1=%d,pointer_2=%d\n”,* pointer_1,* pointer_2); //输出两指针 return 0; //指定函数返回值为0 }
C
程 序 设 计 |
第 八 章
第七章 善于利用指针
C语言程序设计
主讲:周常欣
C
程 序 设 计 |
第 八 章
第八章 善于利用指针
本章目录
8.1 指针是什么 8.2 指针变量

使用指针变量的例子 怎样定义指针变量 怎样引用指针变量 指针变量作为函数参数
C
程 序 设 计 |
第 八 章
第八章 善于利用指针
C
程 序 设 计 |
第 八 章
第八章 善于利用指针
8.2.4 指针变量作为函数参数 例8.3输入a和b两个整数,按先大后小的顺序输出a和b。 现要求用函数实现,且用指针类型数据作函数参数。
#include <stdio.h> int main() { void swap(int * p1,int * p2); int * pointer_1,* pointer_2,a,b; a=3,b=6; pointer_1=&a; pointer_2=&b; printf("初始时:a=%d,b=%d\n",a,b); if(a<b) swap(pointer_1,pointer_2); printf("最大值为:%d,最小值为:%d\n",a,b); return 0; }
C
程 序 设 计 |
第 八 章
第八章 善于利用指针
例8.2输入a和b两个整数,按先大后小的顺序输出a和b。
不交换整型变量的值,而交换两个指针的值 注意:a和b的值并未没交换,它们依旧保持原来的值, 但是p1和p2的值改变了。 p1 p &a p2 &b
a
5
p1
a 5 b 9
p
b
&a p2 &b
9
{p1=&b;p2=&b;} //交换p1和p2的地址
8.3.1 数组元素的指针 一个变量有地址,一个数组包含若干元素,每个数组元 素都在内存中占用存储单元,它们都有相应的地址。指 针变量既然可以指向变量,当然也可以指向数组元素 (把某一元素的地址放到一个指针变量中)。所谓数组 元素的指针就是数组元素的地址。 可以用一个指针来指向一个数组元素,例如: int a[10]={1,3,5,7,9,11,13,15,17,19};
8.1 指针是什么
为了说清楚什么是指针,必须弄清楚数据在内存中是如 何存储的,又是如何读取的。 如果在程序中定义了一个变量,在编译时就给这个变量 分配内存单元。系统根据程序中定义的变量类型,分配 一定长度的空间。
例如,VC++6.0编译系统一般为整型变量分配4个字节, 为单精度浮点型变量分配4个字节,为字符型变量分配1 个字节。内存区的每一个字节有一个编号,这就是“地 址” 。
可以在定义指针的时候,同时对它初始化。如:
int * pointer_1=&a; int * pointer_4=&b;
指针前面的“*”号表示该变量是一个指针型 变量。指针的名为pointer_1和pointer_4
C
程 序 设 计 |
第 八 章
第八章 善于利用指针
一个变量的指针的含义包括两个方面,一是以存储单元 编号表示的地址(如编号为2000的字节),一是它指向 的存储单元的数据类型。(如:int,char,float)
前面介绍过基本的数据类型(如int、float、double等) 既然有这些变量,就可以有指向这些类型变量的指针。
如: int * pointer_1;
C
程 序 设 计 |
第 八 章
第八章 善于利用指针
下面都是合法的定义:
float * pointer_3; char * pointer_4;
说明:
C
程 序 设 计 |
第 八 章
第八章 善于利用指针
8.2.3 怎样引用指针变量
(1)给指针变量赋值,如:
p=&a; //把a的地址赋给指针变量p 指针变量p的值是变量a的地址,p指向a
(2)引用指针变量指向的变量
如已执行“p=&a;”即指针变量p指向了整型变量a,则 printf(“%d”,* p); int a=12; int *p=&a; printf("%d\n",*p);
指向整型数据的指针的类型表示为int *,读作 “指向int的指针”或简称“int指针” 指针变量中只能存放地址(指针),不要将一个整数 赋给一个指针变量。 *pointer_1=100;
原意是想将地址100赋给指针变量pointer_1,但是系 统无法辨别这是地址,从形式上看是整常数,而整常 数只能是整型变量,而不能赋给指针变量,判为非法。
C
程 序 设 计 |
第 八 章
第八章 善于利用指针
void swap(int * p1,int * p2) { int temp; temp = * p1; * p1 = * p2; * p2 = temp; } //定义swap函数
CLeabharlann 程 序 设 计 |第 八 章
第八章 善于利用指针
8.3 通过指针引用数组
图 8.1
C
程 序 设 计 |
第 八 章
第八章 善于利用指针
直接访问与间接访问 i i+1 i+2 i_ponit=&i;
直接
间接
C
程 序 设 计 |
第 八 章
第八章 善于利用指针
间接访问
i 直接访问,根据变量名 直接指向变量i赋值。
2000 (a) i_pointer *i_pointer 间接访问,先找到存 放变量i的地址,从 而找到i变量的存储 单元,然后对其进行 存取访问。
C
程 序 设 计 |
第 八 章
第八章 善于利用指针
(3)引用指针变量的值(地址)
printf(“%o”,p); #include <stdio.h> int main() { int a=12; int *p=&a; printf("%d\n",*p); printf("%o\n",p); return 0; }
2000
(b)
C
程 序 设 计 |
第 八 章
第八章 善于利用指针
指针概念
指向就是通过地址来体现的。假设i_pointer中的值是变 量i的地址(2000),这样在i_pointer和i之间建立起一种 联系,即通过i_pointer能知道i的地址,从而找到变量i 的存储单元。 由于通过地址能找到所需的变量单元,因此说,地址指向 该变量单元(如同说,一个房间号指向某一个房间号一样) 将地址形象地称为“指针”。 指针变量就是地址,用来 存放地址,指针变量的值 是地址。 一个变量的地址称 为该变量的“指针”
因此,下面两个语句等价: p=&a[0]; //p的值是a[0]的地址
p=a; //p的值是数组a首元素的地址 数组名不代表整个数组,代表数组首元素的地址
C
程 序 设 计 |
第 八 章
第八章 善于利用指针
(1)如指针变量p已指向数组中的一个元素, 则p+1指向同一数组的下一个元素,p-1指向同一数组的 上一个元素。 注意:加一个整数(用+或+=),如p+1 低
这个“地址”相当于旅馆中的房间号。在地址所 标志的内存单元中存放的数据则相当于旅馆房间 里中居住的旅客。
C
程 序 设 计 |
第 八 章
第八章 善于利用指针
由于通过地址能找到所需 的变量单元,可以说,地址指向该变量 单元。打个比方,一个房间的门口挂了一个房间号2008, 这个2008就是房间号的地址,或者说2008指向该房间。因 此,将地址形象化地称为“指针”。
相关文档
最新文档