指针学习笔记(下)

关于直接复制代码出错原因的解释:以下代码都是经过我编译通过的。如果出现问题,一可能是粘贴复制时出现错误,二可能是与你的编译器有冲突。有些代码可能写的不够好,作为反面教材就可以!

上次的内容:

1.指针的定义

2.  指针与一维数组的关系

3. 指针与二维数组的关系

4.  指针数组与数组指针

5.  指针函数与函数指针

6.字符串的处理

a.遍历每个字符charAt

b.计算字符串的长度

c.求某个字符在字符串的第一次出现的位置

d.求某个字符在字符串的最后一次出现的位置

e.统计某个字符的个数

f.比较两个字符串的大小

下面继续:

g.连接两个字符串

#include <STDIO.H>

char* concat(char* str1,char* str2);

int main()
{
	char str1[7]="Hello,";
	char str2[7]="World!";

	char *s=concat(str1,str2);
	for (int i=0;i<13;i++)
	{
		printf("%c",*s++);
	}

	getchar();

	return 0;
}

char* concat(char* str1,char* str2)
{
	char* str=str1;

	while(*str1++!='\0')
	{
		;
	}

	while((*str1++=*str2++)!='\0')
	{	;
	}
	
	*str1='\0';
	return str;
}

h.从某个字符截取

#include <STDIO.H>
char *subString(char *str,char ch);
int main()
{
	char *str="HelloWorld!";
	char *s=subString(str,'l');
	for (int i=0;i<10;i++)
	{
		printf("%c",*s++);
	}
	return 0;
}
char *subString(char *str,char ch)
{
	int i=firstindexof(str,ch);//用到了第一次出现的位置

	int len=length(str);//用到了求字符串长度

	char *strs=str+i;
	
	return strs;
}


j.从某个位置开始截取后面的字符

#include <STDIO.H>
char *subString(char *str,int place);
int main()
{
	char *str="HelloWorld!";
	char *s=subString(str,2);
	for (int i=0;i<10;i++)
	{
		printf("%c",*s++);
	}
	return 0;
}
char *subString(char *str,int place)
{
	int len=length(str);//用到了求字符串长度
	char *strs=str+place;	
	return strs;
}
k.从某个字符开始截取后面的某几个字符

#include <STDIO.H>
char *subString(char *str,int start,int end);
int main()
{
	char *str="HelloWorld!";
	char *s=subString(str,3,6);
	printf("%d",length(s));
	return 0;
}
char *subString(char *str,int start,int end)
{
	if (end<start)
	{
		return "input invalid!";
	}
	int len=length(str);//用到了求字符串长度
	char *strs=str+start;
	char *strs2=str+end+1;
	char *strs3=strs;
	while(*strs++!='\0' && *strs2++!='\0')
	{	
		;
	}
	return strs;
}

7. 指针与结构体

指针与结构体也有两种,一是结构体指针,另一种是指针结构体。所谓结构体指针,是指结构体里的类型是由指针定义的。指针可以访问该类型的值所在的地址。而指针结构体,则是可以通过指针访问该结构体的位置。然后再去访问该结构体的变量。

实例:

#include <STDIO.H>
struct Date
{	int year;
	int month;
	int day;
};
struct PERSON
{
	char *name;
	int age;
	struct Date *date;
};

int main()
{
	struct Date dates={2012,12,12};
	struct Date* date1=&dates;
	struct PERSON person1={"songbird",12,date1};
	printf("%s\n",person1.name);//结构体指针的引用用”.”
	printf("%d\n",person1.date->year);指针结构体的引用用”->”
	return 0;
}


结构体很像我们学java或者c++等面向对象的类。或者说更像是一个类的构造器。

基于此,可以尝试着写一个C语言的类。

#include <STDIO.H>
//继承
struct FatherAnimal
{
	char *name;
	double weight;
};

struct SonDog
{
	int legs;
	char *area;
	struct FatherAnimal *fatherAnimal;
};

//set与get方法
void setName(struct FatherAnimal *animal,char *animalname);
char *getName(struct FatherAnimal *animal);
void setWeight(struct FatherAnimal *animal,double animalweight);
double getWeight(struct FatherAnimal *animal);
void setLeg(struct SonDog *sondog,int doglegs);
int getLeg(struct SonDog *sondog);
void setArea(struct SonDog *sondog,char* dogarea);
char *getArea(struct SonDog *sondog);

int main()
{

	struct FatherAnimal animal;
	struct FatherAnimal *animals=&animal;
	struct SonDog sondog;
	struct SonDog *sondogs=&sondog;
	setName(animals,"Hello");
	setWeight(animals,22.3);
	setLeg(sondogs,4);
	setArea(sondogs,"Asian");
	char *name=getName(animals);
	double weight=getWeight(animals);
	int legs=getLeg(sondogs);
	char *area=getArea(sondogs);
	struct FatherAnimal an={name,weight};
	struct FatherAnimal *ans=&an;
	struct SonDog son={legs,area,ans};
	printf("%s\n",son.fatherAnimal->name);
	printf("%.2lf\n",son.fatherAnimal->weight);
	printf("%s\n",son.area);
	printf("%d\n",sondog.legs);
	return 0;
}

void setName(struct FatherAnimal *animal,char *animalname)
{
	animal->name=animalname;
}

char *getName(struct FatherAnimal *animal){return animal->name;}

void setWeight(struct FatherAnimal *animal,double animlweight)
{
	animal->weight=animlweight;
}

double getWeight(struct FatherAnimal *animal){return animal->weight;}

void setLeg(struct SonDog *sondog,int doglegs)
{
	sondog->legs=doglegs;
}

int getLeg(struct SonDog *sondog){return sondog->legs;}

void setArea(struct SonDog *sondog,char* dogarea)
{
	sondog->area=dogarea;
}

char *getArea(struct SonDog *sondog){return sondog->area;}

8.指针与文件

a.读取文件文本

#include <STDIO.H>
#include <STDLIB.H>
#include <MALLOC.H>

int main()
{
	//行读取
	FILE *afile;//*的作用是访问到afile这个地址,然后读取

	afile=fopen("E:\\my.txt","r");//afile为文件的地址
	
	char *str=(char *)malloc(10);//内存分配

	if (afile==NULL)//文件不存在检测
	{
		printf("Can`t found the file!\n");
	}

	while(!feof(afile))//是否读取到末尾判断
	{
		fscanf(afile,"%s",str);//读取文件内容
		printf("%s\n",str);//输出到控制台
	}
	fclose(afile);//关闭文件

	return 0;
}
/************************************************************************/
/* 
E:\\my.txt的内容:
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0">
  <display-name>mytest</display-name>
  <welcome-file-list>
    <welcome-file>index.html</welcome-file>
    <welcome-file>index.htm</welcome-file>
    <welcome-file>index.jsp</welcome-file>
    <welcome-file>Hello.jsp</welcome-file>
    <welcome-file>default.html</welcome-file>
    <welcome-file>default.htm</welcome-file>
    <welcome-file>default.jsp</welcome-file>
  </welcome-file-list>
  <filter>
  	<filter-name>
  	struts2
  	</filter-name>
  	<filter-class>
  	org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter
  	</filter-class>
  </filter>
  <filter-mapping>
  	<filter-name>struts2</filter-name>
  	<url-pattern>/*</url-pattern>
  </filter-mapping>
  
</web-app>                                                                     */
/************************************************************************/
#include <STDIO.H>
int main()
{
	//字符读取
	FILE *afile;//*的作用是访问到afile这个地址,然后读取
	afile=fopen("E:\\xiao.txt","r");//afile为文件的地址
	char c;
	if (afile==NULL)//文件不存在检测
	{
		printf("Can`t found the file!\n");
	}
	while(!feof(afile))//是否读取到末尾判断
	{
		c=fgetc(afile);//读取文件内容

		printf("%c\n",c);//输出到控制台
	}

	fclose(afile);//关闭文件

	return 0;
}

/************************************************************************/
/* 
E:\\xiao.txt的内容:
I am bad and that's good. I will never be good and that's not bad.
 There is no one I would rather be than me.                                                                     */
/************************************************************************/
b.写入文件文本

#include <STDIO.H>
int main()
{
	//字符写入
	FILE *afile;//*的作用是访问到afile这个地址,然后读取
	afile=fopen("E:\\hello.txt","w+");//afile为文件的地址,无文件创建文件	
	char c='0';
	while(c!='1')
	{
		scanf("%c",&c);
		fputc(c,afile);
	}	
	fclose(afile);//关闭文件
	return 0;
}

/************************************************************************/
/* 
创建的E:\\hello.txt的内容:
the early bird
1                                                                     */
/************************************************************************/
#include <STDIO.H>
#include <MALLOC.H>
char strValue(char *str);
int main()
{
	//字符串写入
	FILE *afile;//*的作用是访问到afile这个地址,然后读取
	afile=fopen("E:\\hello.txt","w+");//afile为文件的地址,无文件创建文件	
	char *c=(char *)malloc(4);
	printf("quit for quit!\n");
	while(true)
	{
		scanf("%s",c);
		if (strValue(c)=='q')
		{
			break;
		}
		fputs(c,afile);
	
	}
		
	fclose(afile);//关闭文件

	return 0;
}

char strValue(char *str)
{
	return *str;
}

/************************************************************************/
/* 
创建的E:\\hello.txt的内容:
the early bird                                                                     */
/************************************************************************/

到此结束啦,关于单双链表,考虑到还是在数据结构中仔细探讨为好。网络上也有详细的讲解。晚安啦!










  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值