首页 > 其他分享 >指针(2),迭代,快速排序,单词倒置

指针(2),迭代,快速排序,单词倒置

时间:2024-05-29 22:03:41浏览次数:14  
标签:begin const 迭代 int s1 char 倒置 hello 指针

指针运算:



+N
-N
p++   //往后跳了一个元素 
p--   //往前一个元素 
p-q   //相同类型的指针 减出的来的结果为 ,地址之间相差的元素个数 
关系运算:
p > q    
p < q 
> >= < <= != 

迭代:

迭代其实就是一种特殊的循环,迭代根据上一次循环得到的运算结果来进行下一次的迭代,与一般循环固定的结束条件不同,迭代转为设置循环的开始与结束条件,这样可以让我们在使用中更加灵活。逆序的迭代写法:(一般写法为计算长度后规定循环次数然后逆序)

void reverse(char *begin,char *end)
{
	while(begin<end)
	{
		char tmp=*begin;
		*begin=*end;
		*end=tmp;
		begin++;
		end--;
	}
}

指针操作 一维 字符数组 

1. 字符型数组 --- 存放字符串的

char s[] = "hello";

['h' ] <---0x1000
['e' ]
['l' ]
['l' ]
['o' ]
['\0']

//谁能这块空间的地址 --- 数组名 
s --->怎么能保存s所代表的地址值 
     //s数组名 --- 数组首元素的地址 &s[0]
   --->地址的类型 
       char * 
       
char *p = s; //指针变量p 指向了 s (数组)

注意:

 char s[] = "hello"; //s的空间开在 栈上 (堆,栈,字符串常量区,全局区(静态区),代码区)
   char *s1 = "hello"; //s1的空间开在栈上,但是s1指向的"字符串常量"
                       //存放"字符串常量区"
                       
                       
  *s1 = *s1 - 32; //不能做 ? 原因是 s1 指向的数据是在 字符串常量区
                  //常量区的数据不能修改 
                  
  const int a = 10; //a成了只读变量 
  
  
  const char * s1 = "hello";   //表示 将 *s1 限定为只读
                               //如果,不希望修改 *s1 的数据
                               //一般 建议加上const 

 char * const s1 = "hello";  //const 离谁近,就是限定谁的 
  
  char const *s1 = "hello"; //此时 还是 *s1 不能被修改  
  int *p; //int 代表基类型 
          //p 本身   
  char const * const s1 = "hello"; // *s1 和 s1 本身都不能被修改 

总结:

  1.const 离谁近,就限定谁 (离类型近,值不能改,离变量名(指针)近,地址不能修改)
  2.const 修饰的变量,为只读变量 //变量还是变量 只是成了只读的 

  3.这里说明,char *a=“hello”; //此处hello存于字符串常量区

                        char ch[ ]=“hello”; const char *a=&ch;   //此处a的值存于栈中,但是不可读

    且char *a=“hello”,char *b=“hello”,不论几个,字符串常量区只有一个hello,a,b均指向它

形参设计:

形参设计:
什么时候需要加const 
1.如果函数内部本身不需要通过*s 修改外面的数据 
此时,建议 统统加上const 

好处:
   1.可以将 错误提前 到 编译时 发现 
   2.提高了参数的适用性 
     可以接收数组名
     也可以接收 字符串常量  //const char * 

实现:
int Puts(char *s)
{
   *s = 'a'; //编译时,不报错 
}
int Puts(const char *s)
{
   *s = 'a'; //编译时,就会报错 
}

const char *s // *s 这种方式修改不了数据 

快速排序:

从end右找小的,begin从左找大的,交换到移动标记begin和end重合,交换begin和key的位置
此时key的左边全是比k小的,右边全是比k大的
分成两个数组继续递归排序,直到只剩一个数(或者还剩两个数排完)-->(begin<=end)

void quickSort(int *begin,int *end)
{
	int *p=begin;
	int *q=end;
	int *k=NULL;

	if(begin>=end)
		return ;
	k=begin;
	while(begin<end)
	{
		while(begin<end && *end>=*k)
			end--;
		while(begin<end && *begin<=*k)
			begin++;
		swap(begin,end);
	}
    swap(begin,k);  //key
	quickSort(begin+1,q);  //此时begin和end是相同的,这么写是为了可读性好
	quickSort(p,end-1);
}

单词倒置:"how are you" -> "you are how"

基本思路:整个字符串逆序-->每个单词逆序

(整个字符串逆序使单词的次序改编版,单词逆序两次变回原样)

以空格或'\0'为判断标志,自增end,直到遇到标志时对end前面单词进行逆序,完成后将begin移动至标志后一位,直到遇到'\0'后begin结束移动,并返回逆序后的字符串

void reverse(char *begin,char *end)
{
	while(begin<end)
	{
		char tmp=*begin;
		*begin=*end;
		*end=tmp;
		begin++;
		end--;
	}
}

char *reverse_string(char *p,int len)
{
	char *end,*begin;
	begin=p;
	reverse(p,p+len-1);
	while(*begin)
	{
		end=begin;
		while(*end != '\0' && *end != ' ')
		{
			end++;
		}
		reverse(begin,end-1);
		if(*begin == ' ')  //倒置结束时,begin在最后一个单词,将begin移至下次开始位置
		{
			begin=end+1;
		}
		else  //到达'\0'后循环结束
		{
			begin=end;
		}
	}
	return p;
}

标签:begin,const,迭代,int,s1,char,倒置,hello,指针
From: https://blog.csdn.net/qq_54094530/article/details/139305741

相关文章

  • 数据要素流通市场的迭代升级
    在当今数字化时代,数据已成为一种极其宝贵的资产,同时对个人隐私的保护也变得日益重要。专注于隐私保护的数据分析和处理过程——隐私计算,正在形成一套允许数据要素在确保个人隐私安全的前提下流通交易的技术框架。我们先来看下数据流通的演进过程:数据流通1.0——通过交易平台......
  • C++ 跨线程 传递指针
    目录在C++中跨线程传递指针时,需要注意线程安全和生命周期管理的问题。以下是一些常见的方法,用于在C++中安全地跨线程传递指针:使用智能指针和线程安全队列结合使用std::shared_ptr和线程安全的队列(如std::queue配合互斥锁)是一种常见的方法。#include<iostream>#include<t......
  • C++:虚表指针、虚表、虚函数和动态多态
    classBase{public:virtualvoidshow(){std::cout<<"Baseshow"<<std::endl;}};classDerived_1:publicBase{public:voidshow()override{std::cout<<"Derivedshow"<<std::endl;}};class......
  • Golang中的三种指针
    三种类型的指针:类型用途备注普通类型指针传递对象的地址,不能做指针运算uintptr作为一段内容的首地址,可以做指针运算,GC不把uintptr当指针,uintptr无法持有对象。uintptr类型的目标会被回收。unsafe.Pointer不能做指针运算,可以用做在不同数据类型指针间转......
  • C语言中,指针的使用
    当使用C语言中的指针时,一些基本的用法和示例可以帮助更好地理解其用法。声明指针:   2.取地址运算符(&)和解引用运算符(*):   3.指针与数组:   4.指针与函数:   5.动态内存分配:6.指针与结构体:        在上面,我展示了指针在C语言中的基......
  • 大集合!!C语言指针知识要点大合集!!小白不要错过喔!!收藏这一篇就足够!!(1)
    指针!!是C语言最本质的特征,学好了指针才能算正式入门C语言喔!!如果你是C语言小白,看这篇文章就对啦!!✍什么是指针?在学习指针之前,我们要先了解内存。我们的代码在运行的时候,会把数据存放在哪里?放在内存里!内存地址内存就像是一栋大旅馆,这栋旅馆里有许多房间,每个房间有着不同的房......
  • 智能指针
    在谈智能指针之前,先谈谈为什么需要智能指针?智能指针的价值1.自动内存管理:智能指针可以自动管理它们所指向的内存。当智能指针离开其作用域或被重置时,它们会自动删除所指向的对象,从而避免了程序员显式调用delete的需要。这有助于减少由于忘记释放内存而导致的内存泄漏。2......
  • (算法)双指针——快乐数 <数据分块>
    1.题⽬链接:快乐数2.题⽬描述:3.题⽬分析: 为了⽅便叙述,将「对于⼀个正整数,每⼀次将该数替换为它每个位置上的数字的平⽅和」这⼀个操作记为x操作; 题⽬告诉我们,当我们不断重复x操作的时候,计算⼀定会「死循环」,死的⽅式有两种:         ▪情况⼀:⼀直在1中......
  • (算法)双指针——复写零 <原地复写>
    1.题⽬链接:1089.复写零2.题⽬描述:3.解法(原地复写-双指针): 算法思路: 如果「从前向后」进⾏原地复写操作的话,由于0的出现会复写两次,导致没有复写的数「被覆盖掉」。因此我们选择「从后往前」的复写策略。但是「从后向前」复写的时候,我们需要找到「最后⼀个复写的数......
  • 想要初步了解指针?看这篇就够啦!
    初级指针    一:指针的解释        什么是指针?本质上指针是内存地址,平时说的指针是指针变量,用来存放地址,指针变量里面存放的是地址而通过这个地址,就可以找到一个内存单元            上示例,定义了int类型的a变量,声明了一个整型......