明明是字符串,为什么写的是char *str

字符串匹配

cpp 复制代码
/*
暴力
将目标串s的第一个字符和模式串T的第一个字符进行匹配
相等,则比较s的第二个和T的第三个
不想等,比较s的第二个和T的第一个
如此循环
O(m*n)

*/
#include<bits/stdc++.h>
using namespace std;

int BF(char *str,char *sub) { //str:主串 sub:子串
	//为什么指针
	if(str==NULL||sub==NULL) {
		return -1;
	}
	int strLen=strlen(str);
	int subLen=strlen(sub);
	int i=0,j=0,index=0;
	while(i<strLen&&j<subLen) {
		if(str[i]==sub[j]) {
			i++;
			j++;
		} else {
			//回退
			i = i-j+1;
			j=0;
		}

	}
	if(j==subLen) {
		return i-j;
	}
	//最后怎么判断找到没有呢?
	return -1;
}
int main() {
	printf("%d\n",BF("ababcabcdabcde","abcd"));
	return 0;
}

为什么我明明想要传入的是字符串,为什么函数里面是char * str?

cpp 复制代码
printf("%d\n",BF("ababcabcdabcde","abcd"));

int BF(char *str,char *sub) { //str:主串 sub:子串

解释1

cpp 复制代码
char* p = "abc";//字符串常量的本质是它的第一个字符的地址。
string s = p;

解释2

在C++中,char *str和char str[]的主要区别在于它们是指针和数组的使用方式,以及它们在内存中的存储位置。
char *str声明一个指向字符的指针。这意味着变量str本身是一个指针,它指向另一块内存,你可以通过这个指针来访问或者修改那块内存的内容。
char str[]声明一个字符数组。这意味着变量str本身就是一块内存,你可以直接访问或者修改这块内存的内容。

主要区别在于,数组的内存是在栈上分配的,而指针的内存是在堆上分配的。

内存分配

内存分配可分为三种:静态存储区、栈区、堆区。

  1. 静态 存储区:该内存在程序编译的时候就已经分配好 ,这块内存在程序的整个运行期间都存在 ,它主要存放静态 数据、全局 数据和常量

  2. 栈区:它的用途是完成函数的调用 。在执行函数时,函数内局部变量及函数参数的存储单元在栈上创建,函数调用结束时这些存储单元自动被释放。

  3. 堆区:程序在运行时使用库函数为变量申请内存,在变量使用结束后再调用库函数释放内存。动态内存的生存期是由我们决定的,如果我们不释放内存,就会导致内存泄漏。(不会自动释放)

也就是说:

如果你需要在函数中修改字符串,你可以使用char *str。

如果你不需要在函数中修改字符串,你可以使用char str[]。

示例代码:

cpp 复制代码
#include<bits/stdc++.h>
using namespace std;
void modifyStringWithPointer(char *str) {
	str = "Modified"; // 修改指针指向的内容
	printf("在函数里面可以进行修改%s\n", str);
	//修改它并没有修改原来main函数的指针指向的数据
	//如果想要改变main里面的就需要返回
	//return str;
}
char *modifyStringWithPointer(char *str) {
	str = "Modified"; // 修改指针指向的内容
	printf("在函数里面可以进行修改%s\n", str);
	//修改它并没有修改原来main函数的指针指向的数据
	//如果想要改变main里面的就需要返回
	//return str;
}

void modifyStringWithArray(char str[]) {
	strcpy(str, "Modified"); // 修改数组内容
}

int main() {
	char *ptr = "Original";
	char arr[] = "Original";
	modifyStringWithPointer(ptr);// ptr的内容没有改变
	printf("main函数里面%s\n", ptr);
	ptr=modifyStringWithPointer(ptr); // ptr的内容有改变
	printf("main函数里面%s\n", ptr); 

	modifyStringWithArray(arr); // arr 的内容改变了
	printf("%s\n", arr); // 输出 "Modified"

	return 0;
}

值传递(pass by value)是指在调用函数时将实际参数复制一份传递到函数中,这样在函数中如果对参数进行修改,将不会影响到实际参数。

也就是传递我们的指针

引用传递(pass by reference)是指在调用函数时将实际参数的地址直接传递到函数中,那么在函数中对参数所进行的修改,将影响到实际参数。

也就是传递数组.

相关推荐
Laurence1 小时前
C++ 引入第三方库(一):直接引入源文件
开发语言·c++·第三方库·添加·添加库·添加包·源文件
蒸汽求职2 小时前
机器人软件工程(Robotics SDE):特斯拉Optimus落地引发的嵌入式C++与感知算法人才抢夺战
大数据·c++·算法·职场和发展·机器人·求职招聘·ai-native
charlee442 小时前
最小二乘问题详解17:SFM仿真数据生成
c++·计算机视觉·sfm·数字摄影测量·无人机航测
Tanecious.2 小时前
蓝桥杯备赛:Day4-P9749 公路
c++·蓝桥杯
旖-旎3 小时前
分治(库存管理|||)(4)
c++·算法·leetcode·排序算法·快速选择算法
Tanecious.3 小时前
蓝桥杯备赛:Day3-P1102 A-B 数对
c++·蓝桥杯
Tanecious.4 小时前
蓝桥杯备赛:Day3-P1918 保龄球
c++·蓝桥杯
良木生香4 小时前
【C++初阶】:C++类和对象(下):构造函数promax & 类型转换 & static & 友元 & 内部类 & 匿名对象 & 超级优化
c语言·开发语言·c++
三雷科技5 小时前
使用 `dlopen` 动态加载 `.so` 文件
开发语言·c++·算法
旖-旎5 小时前
分治(快速选择算法)(3)
c++·算法·leetcode·排序算法·快速选择