='\0';i++) printf("%c",*(b+i)); printf("\n"); return 0; }**/ /**下面用指针来处理这个问题**/ int main
,比原生数组更安全、便捷。... 当类中包含指针成员时,默认的拷贝操作(拷贝构造函数、赋值运算符)是浅层复制(仅复制指针地址,不复制指针指向的内容),可能导致 “同一块内存被释放两次” 的问题。...深层复制会复制指针指向的内容,避免此问题。...:C 风格字符串(字符数组)和 C++ 风格string类(更安全便捷)。...,封装了字符数组,支持直接用运算符操作(如+拼接、==比较),自动管理内存,比 C 风格字符串更安全易用。
px = &x; py = &y; //利用指针来对比 x、y 的值,如果 x 的值比 y 的值小,就交换 if(*px < *py){ //交换步骤,其中*px...自增自减少会实现什么效果大家可以自己尝试运行一下 下面做个小练习,利用字符指针将字符数组 sentence 中的内容复制到字符数组 word 中: //定义字符数组 sentence 和 word,...//数组存放的内容为普通变量,则数组名为变量的指针;数组存放的内容为指针,则数组名为指针的指针。...4.1、函数参数为指针 我们直接做一个练习,定义一个函数,用来交换两个变量的内容。...这里传入的参数为指针,所以调用 swap 方法后 x,y 的内容发生了交换。如果直接传入 x,y,那么交换只在 swap 中有效,在 main 中并没有交换。
、y 的值,如果 x 的值比 y 的值小,就交换 if(*px < *py){ //交换步骤,其中*px == x、*py == y t = *px; *px = *py; *py =...自增自减少会实现什么效果大家可以自己尝试运行一下 下面做个小练习,利用字符指针将字符数组 sentence 中的内容复制到字符数组 word 中: //定义字符数组 sentence 和 word,给...//数组存放的内容为普通变量,则数组名为变量的指针;数组存放的内容为指针,则数组名为指针的指针。...4.1、函数参数为指针 我们直接做一个练习,定义一个函数,用来交换两个变量的内容。...这里传入的参数为指针,所以调用 swap 方法后 x,y 的内容发生了交换。如果直接传入 x,y,那么交换只在 swap 中有效,在 main 中并没有交换。
参数中是不能传数组的,而是首元素的地址 这两个构造也可以合二为一写一个全缺省的构造,这里全缺省的值也不能给空指针(strlen计算字符串长度会对指向的指针解引用,计算时遇到’\0’才中止)。...原字符串的 ‘\0’ 并未被复制到子串中(因为复制范围仅限于有效字符),而子串的 ‘\0’ 是由自身的 += 操作自动维护的(最终 sub 的 _str 会在有效字符末尾自动添加 ‘\0’)。...),避开了深拷贝,实现了高效的资源交换 这里的std::swap只是交换_str(指针)、_size、_capacity这三个成员的值:交换_str时,只是交换了两个指针的地址,不会拷贝指针指向的内存内容..._str 的内容); 将 s._str 指向的字符串深拷贝到 tmp 的内存中(即复制所有字符,包括 ‘\0’)。此时,tmp 已经是 s._str 的一个深拷贝副本。...' //为了方便扩容,当给一个字符串初始化时候 //会将str指向的字符串的内容拷贝到_str指向的的数组空间中 :_size(strlen(str)) { _str = new char
c assign 将新的内容赋值给字符串 insert 在容器的指定位置插入元素 erase 从容器里移除指定的元素或元素范围 replace 在容器或字符串中替换特定元素或子串 swap 交换两个...返回 C 格式字符串 data 返回一个指向字符串内部字符数组的指针 get_allocator 获取容器当前使用的分配器实例 copy 将字符串的一部分复制到一个字符数组中 find 在字符串中查找子字符串或字符第一次出现的位置...compare 对两个字符串进行比较 值得注意的是: c_str() 返回的是一个 const char* 类型的指针,这意味着不能通过该指针修改其所指向的字符串内容 从 C++11 开始,string...::data() 和 string::c_str() 的行为基本一致,都会返回一个以 '\0' 结尾的字符数组指针 对于 copy,目标字符数组必须有足够的空间来容纳要复制的字符,并且需要手动添加字符串结束符以形成有效的...+ 将两个字符串拼接 relational operators 大小比较 swap 交换两个 string 对象的内容 operator>> 输入运算符重载 operator<< 输出运算符重载 getline
即:当前区间的有效索引 疑问:为什么需要随机选择基准值?...第二步:使用数组中的左端值更新边界 + 获取分界点 第三步:使用while循环 第四步:使用do - while循环更新指针i 第五步:使用do - while循环更新指针j 第六步:使用if条件语句判断在满足条件的情况下交换指针...将临时数组 tmp 中的内容复制回原数组 q 的 [l, r] 区间。 疑问:为什么第一种写法是正确的? 局部性: 归并排序的合并操作只影响当前递归层的 [l, r] 区间。...因此:只需要将 tmp 中的内容复制回 q 的 [l, r] 区间。...数据破坏: tmp 只存储了当前递归层的 [l, r] 区间的内容,而第二种写法会将这些内容复制到整个数组 q,破坏其他部分的数据。
与C语言的字符数组和头文件string.h相比,string类具有更丰富的功能、更高的安全性和更便捷的操作方式。本篇文章,我们一起学习探讨string类的一些常用接口及使用方法。...string这里申请空间的机制是类似的。 clear clear的作用是删除对象中字符串的有效内容,使其成为空字符串。注意:clear只会将有效字符清空,而不会改变空间容量的大小。...(7)initializer list 以相同的顺序复制il中的每个字符。 (8)move 获取str的内容。STR保持在未指定但有效的状态。...(7)initializer list 以相同的顺序复制il中的每个字符。 swap 顾名思义,swap的功能是交换两字符串的内容。...它的返回值是指向自己成员字符数组的指针。 该函数返回的指针指向内容被const修饰,我们只能读,不能通过该函数修改字符串内容。
为什么存在那么多的指针类型?...为什么存在那么多的指针类型?...const放在左边,将*p固定住-conat *p p被const固定住,p指向内容的大小不得改变 5.指针运算 指针的基本运算有三种,分别是: 指针+-指数 指针-指针 指针的关系运算 //循环打印数组的内容...,用字符串指针来接收,*p指向的就是数组第一个元素 //{//size_t是无符号返回值 // size_t count = 0; // while (*p !...//另一种写法 size_t my_strlen(char* p)//传过来的是数组名,用字符串指针来接收,*p指向的就是数组第一个元素 {//size_t是无符号返回值 char* star
(2)字符串操作函数(引用头文件): 我们已经学过的字符串操作函数有:strlen、strcmp,今天我们借助网站来学习一下strcpy——复制字符串: 通过网站内容,我们来对字符串拷贝函数做一个总结...a的字符串复制到数组b的字符串中; printf("%s", b); return 0; } 下面我们来看一下运行结果: 大家可以看到,此时数组a的字符串以及成功拷贝到了数组b中。...,数组中的元素是“5元如何用7天”这个字符串,如果我们需要修改这个里面的内容的话,就需要通过strcpy来将修改的字符串复制到该数组中,而结构体成员price是一个整型变量,我们在修改变量的值时只需要重新赋值就可以完成...不对呀,按照起前面的方法,现在我们应该是成功交换了呀,为什么a,b的值没有交换呢?...为什么在进行比大小的时候不需要用指针,而这里需要用指针呢?这个问题我们先保留,下一篇会继续展开说明。
+arr2最大长度(避免溢出) int k = 0; // 目标数组的索引指针,用于记录当前存储位置 // 第一步:将arr1的字符逐个复制到目标数组arr中 for(int i = 0; i 复制有效字符,不会把arr1末尾的'\0'也拼接到目标数组中。 5....如果没有k这个指针,我们很难精准控制目标数组的存储位置。 6....:先复制第一个数组的所有有效字符,再复制第二个数组的有效字符,确保拼接顺序无误; 结束符不可少:拼接完成后必须手动添加'\0',否则目标数组无法被识别为 “字符串”。...希望通过这篇文章,你能对 C 语言数组拼接有更清晰的认识,后续也可以尝试实现 “多个数组拼接”“指定位置插入拼接” 等更复杂的功能~
参数列表:strcpy函数有两个参数,即目标字符串的指针destination和源字符串的指针source。目标字符串应该具有足够的空间来容纳源字符串的内容。...参数修饰符:在参数列表中,const关键字修饰了源字符串的指针source。这表示在函数的执行过程中,不会修改源字符串的内容。...详细介绍: strcpy函数用于将一个字符串复制到另一个字符串中。 具体而言,strcpy函数接收两个参数:目标字符串的指针和源字符串的指针。目标字符串应该具有足够的空间来容纳源字符串的内容。...strcpy函数会将源字符串的内容复制到目标字符串中,包括字符串的所有字符和结束符'\0'。复制后,目标字符串将与源字符串完全相同。...通过strcpy函数,源字符串的内容被复制到目标字符串中,最终目标字符串也变为"Hello China"。
比如: 了解 reserve 预分配容量的机制,能够有效减少字符串动态扩容带来的性能开销; 理解深拷贝的实现逻辑,可以避免因传参、赋值所引发的内存错误; 明白为什么 string 可以使用多种...string { private: char* _str;//数组用来存储字符串 size_t _size;//有效字符个数 size_t _capacity;//空间大小 }; }...在string类的接口中,有一个成员函数——c_str,这个函数就是可以返回底层的字符串,所谓返回底层的字符串就是返回底层中指向数组的指针,ok,既然已经这么清晰了,直接上代码: const char*...简单来说,就是当cout遇到const char* 类型时,他会将其视为C风格的字符串,并输出该指针指向的字符串内容,若const char* 指向的是nullptr,则cout是未定义的行为,通常会导致程序崩溃..._size + 1); 将源字符串 str 中的实际字符数据(包括结束符)完整复制到新分配的内存中 此时系统中存在两份相同字符串数据的副本 3.
[0_u8, N + 1]字节数组;然后,用字符串有效内容复写前N个字节;最后,保留尾字节是\0 [例程2]。...要么,先Vec::with_capacity(N)划出一段连续且未初始化内存;再,填充字符串有效内容;最后,由Vec::resize(N, 0)扩展字节数组至N + 1个字节和给尾字节写入\0值 [例程...其中,N代表C字符串的有效内容长度。 这样就绕过了较慢的vec![0_u8, N]宏了。 【C字符串】的实际长度总比它的有效内容长度多1个字节 — \0。...于是,先libc::malloc(...)在C内存划出一段未初始化的字节数组;然后,将C字符串有效内容都给填过去;再,塞上尾字节\0;接着,把原始指针丢给C调用端程序;最后,Rust函数安全、合规地结束...其指向一段初始化为\0的字节数组。C程序向此指定的字节数组写入欲传递给Rust程序的C字符串(有效内容,不含尾字节\0)。 size是【输入·参数】。其是buffer字节数组的长度。
一、为什么要学指针 指针是C语言的核心和灵魂,学习指针不仅仅是为了理解C语言的语法,更是为了掌握它提供的高级编程能力。...通过传递指针(即地址),只需要传递一个4字节或8字节的地址值,大大减少了数据复制的时间开销。...快速遍历: 使用指针进行数组和数据结构的遍历(指针的自增运算)通常比使用数组下标(涉及到乘法和加法运算)的效率更高,尤其在旧式编译器或性能敏感的场景中。...操作野指针是非常危险的,它可能导致程序崩溃(段错误/Segmentation Fault),或者更隐蔽地破坏程序中其他变量的值。 7.1 野指针的常见成因(为什么会失控?)...= NULL) 来强制检查指针的有效性,防止空指针解引用。
\0)chars2[]="Hello";//内存视角://s2占用了6个字节:'H''e''l''l''o''\0'2.2数组vs指针代码对比:展开代码语言:CAI代码解释//1.字符数组:内容存放在栈上...='\0'){//只要没遇到结束符len++;}returnlen;}3.2strcpy/strncpy:复制strcpy(dst,src):把src的内容(含\0)拷给dst。...3.3strcmp:比较错误写法:if(s1==s2)——这比的是地址,不是内容!正确写法:if(strcmp(s1,s2)==0)——相等返回0。...题目2:chars[]="abc";这个数组实际占用了几个字节?题目3:为什么不能用if(str=="hello")来判断字符串内容?题目4:下面代码输出什么?...为什么它很危险?题目9:编写一个函数my_strcpy,实现字符串复制。题目10:char*p="Hello";p[0]='h';这行代码会发生什么?题目11:如何将字符串"123"转换为整数123?
指针定义: 慢指针 slow:指向 “已处理的有效数组的末尾”(即最终保留元素的位置)。 快指针 fast:遍历整个数组,负责 “寻找需要保留的元素”。...思路: 快指针负责 “筛选” 有效元素(不等于 val 的元素),慢指针负责 “记录” 有效元素的位置。当快指针找到有效元素时,就把它 “搬运” 到慢指针的位置,然后慢指针前进一格。...请注意 ,必须在不复制数组的情况下原地对数组进行操作。...思路 (1) 快慢指针 通过将字符串转为数组,就可以将单个字符串转化为移除元素的问题了,不同的是遇到#要回退一格,返回的新数组由慢指针决定长度 缺点是空间复杂度是O(n),不满足题目的进阶 class...快慢指针法的新长度为 slow,判题仅检查前 slow 个元素;后续内容无需关心。 处理空数组时应当考虑边界(若题目保证长度 ≥ 1,可不写额外分支)。
在C++中,当类包含指针成员并指向堆内存时,必须通过深拷贝来避免以下问题: 深拷贝的实现 深拷贝通过分配新内存并复制内容,确保对象间的独立性。..._size + 1); // 复制内容(包含'\0') _size = s._size; _capacity = s....size_t _size; // 当前长度 const static size_t npos; // 特殊值,表示无效位置 }; _str:动态分配的字符数组,存储字符串内容(以'\0'...我们可以用数组来解决这个问题: 定义一个buff[128],我们将输入的数据存入数组, 情况1:输入结束且数组未满,直接将数组中的字符尾插到目标字符串。...情况2:输入未结束且数组已满,将数组中的字符尾插到目标字符串,继续从数组的起始位置重新存输入的数据,循环往复。 注意:每次要尾插数据前,要在数组的有效数据后赋值\0,否则会造成数据错乱。
首先,pi是一个指针变量,pi的内容为i的地址。因为运算符是右结合,则先是运算*pi。即为pi地址中的内容,就是10。然后再取地址,&*pi即为i的地址。...= NULL; //3、赋予指定地址 pz = 4000; } (2)指针与整数的加减运算 指针变量自增或自减,即指针向前或者向后移动一个存储单元 指针比那里加上一个整型数...3.2、字符指针和字符数组 在C语言中,系统本身没有提供字符串数据类型,但可以使用两种方式存储一个字符串:字符数组方式和字符指针方式。...; printf("%s", sentence); } 来个小练习: /** * 用数组将字符串sentence复制到字符串copy */ void mian(){ char *sentence...printf("二级指针ppa为:%d", pp); //指针的指针和普通指针操作一样,可以用*pp获取pp指向地址中的内容,即p存储的内容 printf("p存储的内容为:%d",
我是更喜欢用string类操作字符串的,只是我家小朋友刚开始学指针,而字符串操作是非常适合练基本功的。...减法运算的值是两个指针在内存中的距离(以数组元素的长度为单位,而不是以字节为单位)与数组中存储的元素的类型无关,因为减法运算的结果已经将地址的差值除以该类型占用内存的长度。...;有溢出危险 string::resize–改变(增加或减少)字符串长度;如果增加了字符串长度,新字符缺省为 0 值 string::swap–与另一个 string 交换内容 string::replace...std::operator>>–从输入流中读取一个字符串 std::getline–从istream中读入一行或一段字符到string中 std::swap–交换两个string的内容。...如果n过小,那么strncpy就不能复制末尾的空字符,如果n比源字符串长度大,strncpy在遇到空字符后会不断向目的字符串追加空字符,直到达到n个。