最近在看《C程序设计语言》,看到指针和数组一章。感觉指针真的太好了,以前都怪 自己没有好好学习,现在决定好好补充指针知识。 请理解下面几点: 1.指针是变量,存储地址。可以P++,赋值,当成数组成员(指针数组)。 2.数组名是数组首地址,用指针作为形参,来接收参数。 3.在函数定义中,char *p和char p[]等价,这里的P都是指针,第二个的P不是数组 名,是指针,因为可以P++,可以赋值。 4.函数返回两个数时,要用指针。 5.无论是传数组名,还是传字符串,函数都用指针作为形参,指向数组首地址,指向字 符串第一个字母。 6.使用指针,可以避免内存开销,但是一定要注意,修改了原始的实际参数值。 详细理解,还请看下面程序: 1.使用指针计算数组长度,和进行字符串拷贝。#include <stdio.h> //计算数组长度 int strlen(char *p) { int i; // p[4]='x'; for(i=0;*p!='\0';p++) i++; return i; } //利用指针进行字符串拷贝 int strcpy(char *s,char *t) { for(;*s==*t;s++,t++) if(*s=='\0') return 0; return *s-*t; } int main() { int length; char s[]="xieweichong"; length=strlen(s+2); printf("%d\n",length); printf("%s\n",s); char t[]="yangyanga"; int result=strcpy(s,t); printf("%d\n",result); return 0; }
2.字符数组的用法,读取一行文本,存储在字符数组中。
#include <stdio.h> #define MAXLINE 1000 //读取一行 int getLine(char *s,int maxline) { char c; int i; for(i=0;(i<maxline-1) && ((c=getchar())!=EOF) && c!='\n';i++) s[i]=c; if(c=='\n') { s[i]='\n'; i++; } s[i]='\0'; return i; } //进行拷贝 void copy(char *s,char *t) { for(;(*s=*t)!='\0';s++,t++) ; } int main() { int maxLength=0; int length; char line[MAXLINE]; char longestLine[MAXLINE]; while((length=getLine(line,MAXLINE))>0) if(length>maxLength) { maxLength=length; copy(longestLine,line); } if(maxLength>0) { printf("%d\n",maxLength); printf("%s",longestLine); } return 0; }
3.给定哪一年,哪一天,算出具体是那一年的几月几号。记住:返回两个值可用指针。
仔细察看二维数组的参数传递过程。
#include <stdio.h> //return two values,Please use point void month_day(char (*a)[13],int year,int yearday,int *pmonth,int *pday) { int i,leap; leap=((year%4==0 && year%100!=0)||(year%400==0)); for(i=1;(yearday-a[leap][i])>0;i++) yearday=yearday-a[leap][i]; *pmonth=i; *pday=yearday; //a++; //printf("%d\n",a); } int main() { char a[2][13]={ {0,31,28,31,30,31,30,31,31,30,31,30,31}, {0,31,29,31,30,31,30,31,31,30,31,30,31} }; int month,day; int year,yearday; while(scanf("%d %d",&year,&yearday)!=EOF) { month_day(a,year,yearday,&month,&day); printf("%d %d\n",month,day); } return 0; }
4.对长度不同的多行文本进行排序,仔细观察指针数组的使用。
程序逻辑:读取所有输入行,对文本进行排序,按次序打印文本行。
程序值得仔细揣摩的地方有:
1.如何将读取的文本串存入数组。
2.如何将数组的内容存入指针开辟的内存中。
3.如何将指针存入指针数组中。
4.排序过程中,如何比较指针。
5.打印按照指针打印出来,有什么好处?(避免内存消耗)
6.用指针来编程,最好能画图,将指针简单的标注一下,这样更清晰。
#include <stdio.h> #include <stdlib.h> #define MAXLINE 1000 #define MAXLEN 500 char* line[MAXLINE]; //进行数组拷贝 void copy(char *s,char *t) { for(;(*s=*t)!='\0';s++,t++) ; } //读取一行 int getLine(char *s,int maxSize) { int i; char c; for(i=0;(i<maxSize-1) && ((c=getchar())!=EOF) && c!='\n';i++) s[i]=c; if(c=='\n') { s[i]='\n'; i++; } s[i]='\0'; return i; } //读取所有文本行 int readLines(char **line,int maxSize) { char *p; char storelines[MAXLEN]; int length; int countlines=0; while((length=getLine(storelines,maxSize))>0) { p=(char *)malloc(sizeof(char)*(length+1)); storelines[length-1]='\0'; copy(p,storelines); printf("%d\n",length); line[countlines++]=p; } return countlines; } //交换指针 void swap(char **v,int i,int j) { char *temp; temp=v[i]; v[i]=v[j]; v[j]=temp; } //对指针进行排序 void sort(char **v,int left,int right) { int i,last; if(left>=right) return; swap(v,left,(left+right)/2); last=left; for(i=left+1;i<=right;i++) if(strcmp(v[i],v[left])<0) swap(v,++last,i); swap(v,left,last); sort(v,left,last-1); sort(v,last+1,right); } //打印 void writeLines(char **line,int lines) { int i; for(i=0;i<lines;i++) printf("%s\n",line[i]); } int main() { int lines; if((lines=readLines(line,MAXLEN))>0) if(lines<=MAXLINE) { sort(line,0,lines-1); writeLines(line,lines); } else printf("too many lines\n"); return 0; } 明天继续指针的学习,加油!
彻底理解指针第一篇
最新推荐文章于 2021-12-08 22:42:19 发布