彻底理解指针第一篇

来源:互联网 发布:网络加密机原理 编辑:程序博客网 时间:2024/05/03 02:24
 
  最近在看《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 pointvoid 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 500char* 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);}elseprintf("too many lines\n");return 0;}  明天继续指针的学习,加油  



原创粉丝点击