Строка Передача по значению

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++, когда вы передаете строку, передается базовый адрес строки.

Это означает, что автоматически производится вызов по адресу. Поэтому изменения, внесенные в формальные аргументы, отражают фактический аргумент.

Вы не можете передать строку по значению.

Но в качестве альтернативы вы можете передавать каждый символ строки по значению и сохранять каждый символ в другой переменной в этой функции.

Или вы можете создать временную переменную в функции, чтобы сохранить исходную строку, а затем внести изменения с помощью временной строки.

Другие вопросы по тегам