字符串 按值传递
String Pass by value
Turbo C++:我想在不更改原始数据的情况下将字符串传递给函数(按值传递)。如何在这段代码中实现???
#include<iostream.h>
#include<conio.h>
#include<string.h>
void pass(char g[20])
{
g[0]=g[2];
cout<<"nPassed: ";
for(int i=0;i<strlen(g);i++)
cout<<g[i];
}
void main()
{
clrscr();
char a[20];
cout<<"nEnter the Data: ";
cin.get(a,sizeof a);
int len=strlen(a);
pass(a);
cout<<"nAfter pass: ";
for(int i=0;i<len;i++)
cout<<a[i];
getch();
}
C 中的字符串是将 ' '
作为最后一个元素的字符数组(使用一些语法糖来定义此类数组)。C 中的数组不是一等公民;特别是,它们不能作为参数传递。将数组传递到函数中时,该函数将收到指向数组第一个元素的指针。指向内存的不被复制,只有指针被复制。因此,在修改指向内存时,调用函数中的内存会被修改。
C++从C继承了这些特征。如果要使用所述的 C 字符串,则必须在将它们传递到函数之前或在函数本身内手动复制它们。
但是,C++ 中的首选方法是使用C++标准库中的std::string
。在您的情况下,将pass
声明为
void pass(std::string g)
并将strlen(g)
替换为g.length()
。
C++传递字符数组时,传递字符数组的基址。
这意味着自动按地址呼叫。这就是为什么对正式论点所做的更改会反映回实际论点的原因。
不能按值传递字符数组。
但是,你也可以通过值传递字符串的每个字符,并将每个字符存储在该函数的另一个变量中。
或者,您可以在函数中创建一个临时变量来存储原始字符串,然后使用临时字符串进行更改。
你也可以使用 std:string 类代替字符数组。在这种情况下,只需传递变量即可完成工作(按值传递)。
相关文章:
- 何时应通过引用传递矢量参数而不是按值传递矢量参数?
- C++类 - 初始化列表 - 递归 - 按值传递
- 将函数参数完美转发到函数指针:按值传递呢?
- 棘手的按值传递和按引用递归问题传递
- 不同于按值传递和常量引用传递的程序集
- 按值传递变量与按引用传递变量具有相同的结果
- 为什么按值传递QStringView比引用常量更快?
- 获取 std::函数以推断按引用传递/按值传递
- 在函数中按值传递 unordered_map/unordered_set 是否有效? C++
- C++/11 auto 关键字是在更有效时推导参数进行按引用传递,还是始终按值传递?
- 使用 enable_if 在按值传递与按引用传递之间更改函数声明
- 防止在按值传递对象(继承)时进行切片
- 为什么C++编译器不在按值传递方案中优化更多的字符串构造?
- 字符串 按值传递
- 按引用和值传递字符串C++
- 具有字符串流的类尝试按值传递
- 我应该按值传递字符串还是将指针传递给它
- 按值传递字符串vs按值传递每个字符
- std::字符串可以跨DLL边界按值传递吗?
- 在c++中按值传递字符串和向量