指针操作一维字符型数组和及回调函数------努力学习嵌入式的第十四天!今天的内容让人脑瓜子嗡嗡的 着重复习

总结

1.快速排序

注意:

  第二三步并不能反过来  要想降序排列只需要加将比较的符号换一下

2.指针操作一维字符型数组

(const) char *s = "hello";

*s='H';    //错误

char s[]="hello";

s[0] = 'B'

char *strncpy(char *dest, const char *src, size_t n)

{  
   正常拷贝 
   多了 一个n 
   n < strlen(src)  
     只拷贝前n个字符,最终dest中不会有'\0'
   n == strlen(src)
     正常拷贝 
   n > strlen(src)
   if (n) 拷贝够了次数 
   剩余拷贝 统统补0

}
     思路:
   
   // 结束条件 *src == '\0'
   // n次 拷贝完成没有

char *Strcpy(char *dest,const char *src)
{
	char *ret = dest;

	while (*dest = *src)
	{
		dest++;
		src++;
	}

	return ret;
}


char *Strncpy(char *dest,const char *src,size_t n)
{
	char *ret = dest;

	while (n && (*dest = *src) )
	{
		dest++;
		src++;
		--n;
	}
	//printf("n= %ld\n",n);
	while(n)
	{
		*dest = 0;
		++dest;
		--n;
	}
	return ret;
}

char *strncat(char *dest, const char *src, size_t n)

 {
   拼接的基础上 多 n控制条件 
   
   n < strlen(src) 拼n下就结束   n == 0
    
   n >= strlen(src) src拼完就结束  src=='\0'
   
   *dest = '\0' //?
 }

char * Strcat(char *dest, const char *src)
{
	char *ret = dest;

	while (*dest != '\0')
		dest++;

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

	return ret;
}

char * Strncat(char *dest, const char *src,int n)
{
	char *ret = dest;

	while (*dest != '\0')
		dest++;

	//
	//hello'\0' 
	while(n && *src != '\0')
	{
		*dest = *src;
		dest++;
		src++;
		--n;
	}
	*dest = '\0';

	return ret;
}

 int Strncmp(const char *s1, const char *s2, size_t n)
 

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

	return *s1 - *s2;
}

int Strncmp(const char *s1,const char *s2,int n)
{

	//3 
	//2
	//1
	n--;
	while (n&&*s1==*s2 && *s1!='\0' && *s2 != '\0')
	{
		++s1;
		++s2;
	    --n;
	}

	return *s1 - *s2;
}

总结:

1.指针操作一维字符型数组(字符串)

2.函数

grts

puts

strlen

strcpy/strncpy

strcap/strncat

strcmp/strncmp

注意:

1.const 能加的都加

2.函数功能尽可能写的全面

指针+函数

char *strcpy();//返回值类型是指针类型的函数

char *strcap();

回调函数

回调函数:通过函数指针调用的函数叫回调函数
技术上:通过函数指针的实现
函数指针(指向基类型-为函数类型)函数类型的指针

接口

void qsort(void *base,size_t nmemb,size_t size, int (*compar) (const void *,const void *));
@base    数组起始位置
@nmemb    排序的元素个数
@size      单个元素的大小
@compar   比较函数       / /确定进行比较的两个元素的大小规则

void * //万能指针------任意类型性的指针

          //void型

注意:如果通过该类型的地址进行数据访问  一定要转转换成明确的基类型。

总结:

1.指针操作函数

2.函数名就是函数入口地址

3.定义一个函数指针便变量获得函数名

4.使用:通过指针变量获得函数名

5.用途:回调

函数指针 -- 函数的指针  --- 返回的类型是函数类型的 指针 
指针函数 -- 指针的函数  --- 返回值为指针类型 的函数 

指针+二维数组

int a[3][4];  //本质还是一维数组

int[3] a[4];  //理解角度

                    //a----数组名---代表类型----代表类型是 int[3][4]

                   //a代表的值是首元素的地址-----a[0]

                   //a[0]的数据类型是int [4]

                    //&a[0]-----对应的数据类型 int (*)[4]

                     //数组类型的指针是数组指针

*p   //三步运算完成后
     *p 相当于 是 int[4]这种类型 //数组
     *p 就相当于 int[4]这个数组的 数组名

*p <=> a     

*(*(p+i) + j)<=>a[i][j]

p+1       //偏移到了 下一个 int[4]
             //类型为int(*)[4]
*(p+1)     //偏移到下一个int 
               //*(p+1) 代表的类型int[4] 此时相当于是 int[4]的数组名 
               //*(*(p+1) + 1)

  • 27
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

我爱敲代码yx

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值