彻底理解指针第一篇

 
  最近在看《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;
}

  


明天继续指针的学习,加油
  

















评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值