2013-08-30 2 views
3

Я пытаюсь сделать функцию, которая может изменять содержимое указанного массива символовC++ передать массив символов функционировать и изменить его

void change_array(char *target) 
{ 
    target="hi"; 
} 

int main() 
{ 
    char *a[2]; 
    change_array(a[1]); 
    cout<<*(a[1]); 
} 

Но тогда содержание [1] остается на 0x0 (пустота)

+3

Есть ответы, рассказывающие, как пройти мимо ссылка, поэтому я постараюсь поставить вопрос о «если вы так делаете». Ответ: * почти наверняка * «нет, нет, ты не должен». Почему вы используете 'char *', а не 'std :: string'? Если у вас нет неотложной и неотложной необходимости для c-строк, я бы предложил вместо этого использовать 'std :: string'. – anjruu

+0

Нет, у меня есть своя причина использовать строку, поскольку я пишу что-то вроде основной войны, которая должна читать массив символов слово за словом. – Echo

+0

вы можете использовать для этого символ char **. но я бы пошла для решения anjruu использовать строку. – hetepeperfan

ответ

2

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

void change_array(const char*& target) { ... } 
+0

я не передаю ссылку? – Echo

+0

@Echo Если вы хотите передать только один символ по ссылке, вы можете сделать это с помощью указателя. Но вы хотите изменить фактический указатель, поэтому вам нужно передать весь указатель по ссылке И в C++ вы делаете это с «правильными» ссылками, а не с помощью указателей. –

3

Во-первых, ваша функция имеет копию указателя, переданного ей, так что нет никакого эффекта видно на стороне вызывающего абонента. Если вы хотите изменить аргумент функции, передать ссылку:

void change_array(char*& target) { ... } 
//     ^

Во-вторых, вы не можете/не должны связывать неконстантную указатель на строку буквальным. Вместо этого используйте const char*.

void change_array(const char*& target) { ... } 
//    ^^^^^ ^

int main() 
{ 
    const char* a[2]; 
    change_array(a[1]); 
    cout<<*(a[1]); 
} 
+0

Сейчас работает – Echo

1

Вы должны передать его в качестве ссылки:

void change_array(char*&target) 
{ 
    target="hi"; 
} 

В противном случае, вы просто изменить локальную копию target, который не будет делать никакой разницы в стоимости за пределами функции.

0

Попробуйте эту конструкцию вместо:

std::string get_string() 
{ 
    return "hi"; 
} 

int main() 
{ 
    std::string a[2]; 
    a[1] = get_string(); 
    std::cout<< a[1]; 
} 

Заметных пунктов:

  • возвращение значения
  • использования станд :: строка
+0

. Моя действительная цель - не показывать строку, а реально ее изменить для будущих работ – Echo

Смежные вопросы