Строка Передача по значению
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();
}
2 ответа
Строки в C являются символьными массивами, которые имеют '\0'
как последний элемент (с некоторым синтаксическим сахаром, чтобы определить такие массивы). Массивы в C не являются гражданами первого класса; в частности, они не могут быть переданы в качестве аргументов. Когда вы передаете массив в функцию, функция получит указатель на первый элемент массива. Указанная память не копируется, есть только указатель. Из-за этого при модификации указывается на память, память в вызывающей функции изменяется.
C++ унаследовал эти характеристики от C. Если вы хотите использовать строки C, как вы описали, вы должны скопировать их вручную, либо перед передачей их в функцию, либо внутри самой функции.
Однако предпочтительным методом в C++ является использование std::string
из стандартной библиотеки C++. В вашем случае было бы достаточно объявить pass
как
void pass(std::string g)
и заменить strlen(g)
с g.length()
,
В C++, когда вы передаете строку, передается базовый адрес строки.
Это означает, что автоматически производится вызов по адресу. Поэтому изменения, внесенные в формальные аргументы, отражают фактический аргумент.
Вы не можете передать строку по значению.
Но в качестве альтернативы вы можете передавать каждый символ строки по значению и сохранять каждый символ в другой переменной в этой функции.
Или вы можете создать временную переменную в функции, чтобы сохранить исходную строку, а затем внести изменения с помощью временной строки.