指针(2)进阶

目录

指针操作一维字符型数组

指针+字符串

实现字符串的相关函数

用指针实现puts函数功能

指针实现gets函数功能

指针实现strlen函数功能

用指针实现strcpy函数功能 

用指针实现strncpy函数功能

 用指针实现strcat函数功能

  用指针实现strncat函数功能

  用指针实现strcmp函数功能

  用指针实现strncmp函数功能

 memcpy函数

const关键字


指针操作一维字符型数组

推导过程与一维字符型数组相同

char s[]="hello";
char *p = s;

 可以用来存放字符串;

指针+字符串

字符串在c语言中是按照字符数组的形式存在,而字符串常量是存储在字符串常量区的。

处理字符串的形式:

(1)

char s[] = "hello"; 

这句代码表示数组s在栈上开辟一块空间,用字符串常量中的 "hello"进行初始化

(2)

const char *p = "hello";

这句代码表示p指向了字符串常量区中的 "hello",因为是指向了字符串常量区,所以只能做读取操作,不能修改。

实现字符串的相关函数

puts函数

int puts(const char *s);
void Puts(char s[])
void Puts(char *s)

它的实参可以是数组名,也可以是指针变量,也可以是字符串常量

用指针实现puts函数功能

int Puts(const char *s)
{	
	while(*s !='\0' )
	{	
	   putchar(*s++);

	}
	putchar('\n');
	return 0;
}

指针实现gets函数功能

char* Gets(char *s)
{
     char*ret = s;
	while((*s = getchar())!='\n')
	{	
		s++;
	}
	*s='\0';
	return ret;
}

指针实现strlen函数功能

size_t Strlen(const char *s)
{
	const char *ret=s;
	while(*s != '\0')
		s++;
	return s-ret;
}

用指针实现strcpy函数功能 

char *Strcpy(char *dest ,const char *src)
{
	char *ret = dest;
	while(*src != '\0')
	{
	    *dest = *src;
		src++;
		dest++;
	}
	*dest = '\0';
	return ret;
}

用指针实现strncpy函数功能

char *Strncpy(char *dest,const char *src,size_t n)
{
	char *ret = dest;
	while(*src!=0&&n!=0)
	{
		*dest = *src;
		src++;
		dest++;
		--n;
	}
	while(n)
	{
       *dest = '\0';
	   dest++;
	   --n;
	}
	return ret;
}

 用指针实现strcat函数功能

char *Strcat(char *dest,char *src)
{
	char *ret = dest;
    while(*dest!='\0')
		dest++;
	while(*src!='\0')
	{
		*dest=*src;
		dest++;
		src++;
	}
	*dest='\0';
	return ret;
}

  用指针实现strncat函数功能

char *Strncat(char *dest,char *src,size_t n)
{
	char *ret = dest;
    while(*dest!='\0')
		dest++;
	while(n &&*src!='\0')
	{   	
		*dest=*src;
		dest++;
		src++;
		n--;
	}
	*dest='\0';
	return ret;
}

  用指针实现strcmp函数功能

int Strcmp(const char *s1,const char *s2)
{
	while(*s1 == *s2 && *s1 != '\0' && *s2 != '\0')
	{
         s1++;
		 s2++;
	}
	return *s1-*s2;
}

  用指针实现strncmp函数功能

int Strncmp(const char *s1,const char *s2,size_t n)
{
	while(n>1 && *s1 == *s2 && *s1 != '\0' && *s2 != '\0')
	{
         s1++;
		 s2++;
		 n--;
	}
	return *s1-*s2;
}

 memcpy函数

功能是实现内存的拷贝;

函数原型

void *memcpy(void *dest,const void *src ,size_t n)

void * 表示空类型的指针,它可以说是万能指针,因为它可以接受任意类型的指针;

NULL是空指针,注意区分两者;

注意:如果用空类型多指针进行间接运算,必须转换成有明确类型的指针

用指针实现memcpy函数功能

void *Memcpy(void *dest,const void *src ,size_t n)
{
	char *p =dest;
	const char *q = src;
	while(n)
	{	
		*dest = *src;
	     dest++;
		 src++;
		 --n;
	}
}

const关键字

在字符串函数中看到了很多的const char *s;它的效果是限定只读;;它还可以写成下面的三种形式

const char *s   
char const *s 
char * const s 

假设

int *p;
int a = 10;
const int *p = &a

此时const限定的是基类型,就是说不能通过 *p =其他类型的数据赋值的方式修改基类型数据;

int const *p = &a;   

这句代码的作用和上面的代码的一样;

int * const p = &a; 

此时const限定是指针变量p ,表示将p限定为只读,不能做修改;  

const int * const p = &a;  

此时是基类型和指针变量都被限定为只读,既不能通过*p修改基类型数据,也不能修改指针变量p;

以上const符合就近原则,const离谁近就限定谁

const的应用

1.如果不想通过*p方式改变基类型对应的数据 可以使用以下代码

const int *p = &a;  
int const *p = &a;  

 2.如果 指针变量p 定义好后,不想再指向别的变量 ,可以使用以下代码

int * const p = &a;

注意:形参设计为const char *s

(1)目的:是为了防止函数中有时候的失误操作

(2)好处:可以提前发现问题 ,将运行时可能发生的问题,提前到编译时就发现了;它还可以只接受char *和  const char *;

  • 22
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。
1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值