Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 5.00/5: Рейтинг темы: голосов - 5, средняя оценка - 5.00
bambique
1 / 1 / 3
Регистрация: 02.04.2015
Сообщений: 169
1

Методы принимают в качестве аргумента простой указатель, как тогда меняется содержимое строки?

13.09.2015, 00:41. Просмотров 907. Ответов 12
Метки нет (Все метки)

Уже "достали" указатели, недавно разбирал односвязный список и там для того, чтобы изменить значение указателя в функцию передавали указатель на указатель. Сейчас начал читать про классы, есть классы содержащий 2 указателя на строки и соответственно методы по обработке этих данных, эти методы принимают в качестве аргумента простой указатель, как тогда меняется содержимое строки???? Почему там для изменения указателя мы передавали указатель на указатель, а в данном случае просто указатель.

Добавлено через 46 секунд
Ведь в обоих случаях я хочу изменить адрес указатель, то есть его содержимое
0
Лучшие ответы (1)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
13.09.2015, 00:41
Ответы с готовыми решениями:

Как передать функции указатель на функцию в качестве аргумента?
как передать функции указатель на функцию в качестве аргумента?

Передача функции-члена в качестве аргумента (не через указатель)
Привет! Озадачился такой проблемой - вот пример того, что нужно typedef...

Вызов родовой функции (нужно передать массив в качестве аргумента функции через указатель)
#include <iostream> using namespace std; template <class T1> class mas { ...

Указатель на метод класса в качестве аргумента метода класса
Функция _createFun вызывается для создания ХХХ в основном классе. Но вот...

Почему меняется содержимое строки?
Я новичок в С++ и пытаюсь написать простейшую игру: игрок ходит по полю и...

12
Croessmah
++Ͻ
14630 / 8379 / 1582
Регистрация: 27.09.2012
Сообщений: 20,585
Записей в блоге: 2
Завершенные тесты: 1
13.09.2015, 00:45 2
код покажете или будем в "Поле чудес" играть?


P.S. Приз или деньги?
0
castaway
Эксперт С++
4932 / 3038 / 454
Регистрация: 10.11.2010
Сообщений: 11,117
Записей в блоге: 10
Завершенные тесты: 1
13.09.2015, 00:46 3
bambique, говори приз!
0
Supernatural
13.09.2015, 00:50
  #4

Не по теме:

деньги!

0
bambique
1 / 1 / 3
Регистрация: 02.04.2015
Сообщений: 169
13.09.2015, 00:56  [ТС] 5
Цитата Сообщение от Croessmah Посмотреть сообщение
код покажете или будем в "Поле чудес" играть?
P.S. Приз или деньги?
__________________
Приз офк
Есть указатель на следующий элемент списка:
list *begin = new list;
Для изменения адреса, который содержит этот указатель, я передаю в функцию указатель на указатель.
И есть допустим указатель на строку:
char * name;
Для изменения содержимого этого указателя достаточно передать в функцию просто указатель.
0
Croessmah
++Ͻ
14630 / 8379 / 1582
Регистрация: 27.09.2012
Сообщений: 20,585
Записей в блоге: 2
Завершенные тесты: 1
13.09.2015, 01:16 6
bambique, ответ уже содержится в вопросе
Цитата Сообщение от bambique Посмотреть сообщение
Для изменения адреса, который содержит этот указатель, я передаю в функцию указатель на указатель.
Цитата Сообщение от bambique Посмотреть сообщение
Для изменения содержимого этого по адресу, на который "указывает" указатель достаточно передать в функцию просто указатель.
Добавлено через 2 минуты
Всё просто, Вам нужно "что-то" изменить и Вы передаете указатель на это "что-то", так ведь?
Ну так если это "что-то" указатель и нужно изменить указатель, то логично, что для этого в функцию нужно передать указатель на этот указатель или ссылку, но не о ссылках речь
0
bambique
1 / 1 / 3
Регистрация: 02.04.2015
Сообщений: 169
13.09.2015, 01:51  [ТС] 7
Цитата Сообщение от Croessmah Посмотреть сообщение
bambique, ответ уже содержится в вопросе
Сообщение от bambique
Для изменения адреса, который содержит этот указатель, я передаю в функцию указатель на указатель.
Сообщение от bambique
Для изменения содержимого этого по адресу, на который "указывает" указатель достаточно передать в функцию просто указатель.
Добавлено через 2 минуты
Всё просто, Вам нужно "что-то" изменить и Вы передаете указатель на это "что-то", так ведь?
Ну так если это "что-то" указатель и нужно изменить указатель, то логично, что для этого в функцию нужно передать указатель на этот указатель или ссылку, но не о ссылках речь
Это я как раз таки понял, немного не понял с указателем на чар.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include <iostream>
using namespace std;
 
class stock{
    char* name;
public:
    void setName(char *n)
    {
        name=n;
    }
    void showName()
    {
        cout<<name;
    }
};
 
 
int main()
{
    stock l1;
    l1.setName("low");
    l1.showName();
}
Вот набросал, я передаю в функцию адрес, содержащий строку. И потом копии этого адреса присваиваю другой адрес, по идеи сам аргумент не должен был измениться, разве не так?? Скорее всего проблема из-за того, что я до сих пор не до конца понимаю, что такое указатель на тип чар.

Добавлено через 8 минут
Просто как и было сказано ранее, чтобы изменить значение переменной надо передать ее указатель, так и в данном случае получается, чтобы изменить значение указателя(адрес на константу) надо ведь передать указатель на этот указатель.
0
Croessmah
++Ͻ
14630 / 8379 / 1582
Регистрация: 27.09.2012
Сообщений: 20,585
Записей в блоге: 2
Завершенные тесты: 1
13.09.2015, 01:53 8
Лучший ответ Сообщение было отмечено bambique как решение

Решение

Цитата Сообщение от bambique Посмотреть сообщение
по идеи сам аргумент не должен был измениться
так он и не меняется
1
bambique
1 / 1 / 3
Регистрация: 02.04.2015
Сообщений: 169
13.09.2015, 01:57  [ТС] 9
Цитата Сообщение от Croessmah Посмотреть сообщение
Сообщение от bambique
по идеи сам аргумент не должен был измениться
так он и не меняется
А что меняется? Ведь содержимое char* поменять нельзя, можно только поменять адрес на который ссылается данный указатель
0
InCode
2 / 2 / 0
Регистрация: 09.09.2015
Сообщений: 8
13.09.2015, 02:13 10
C++
1
l1.setName("low");
Где то в памяти есть константная строка "low".

Функция setName записывает в указатель name адрес этой строки.
name=n;
0
bambique
1 / 1 / 3
Регистрация: 02.04.2015
Сообщений: 169
13.09.2015, 02:16  [ТС] 11
OMG. Вопросов больше нет...
0
zss
Модератор
Эксперт С++
7258 / 6703 / 4244
Регистрация: 18.12.2011
Сообщений: 17,693
Завершенные тесты: 1
13.09.2015, 08:24 12
bambique, Ваша конструкция чревата утечками памяти.
ОБЯЗАТЕЛЬНО выделяйте память под переменные в конструкторе!!!!
А потом КОПИРУЙТЕ данные.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
class stock
{
    char* name;
public:
    stock(char* t)
    {
         name=new char[strlen(t)+1];
         strcpy(name,t);
    }
    ~stock(){delete[] name;}
    void setName(char *t)
    {
         delete[] name;
         name=new char[strlen(t)+1];
         strcpy(name,t);
    }
    friend std::ostream& operator<<(std::ostream& os,stock& S)
    {
         os<<S.name;
         return os;
    }
...
};
 
int main()
{
    stock L1("low");
    std::cout<<L1;
    L1.setName("high");
    std::cout<<L1;
}
0
Mr.X
Эксперт С++
3180 / 1707 / 435
Регистрация: 03.05.2010
Сообщений: 3,867
13.09.2015, 09:40 13
Цитата Сообщение от zss Посмотреть сообщение
bambique, Ваша конструкция чревата утечками памяти
Не знаю, мне кажется, что использование сишных строк чревато утечками мозга.
1
13.09.2015, 09:40
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
13.09.2015, 09:40

Функция которая удаляет начальные и конечные пробелы из строки, полученной в качестве аргумента
Нужен код без использования strlen

Создать функцию, имеющую два аргумента и возвращающую в качестве аргумента число из отрезка [a,b]
Создать функцию, которая будет иметь два целочисленных параметра a и b, и в...

Как передать функцию в качестве аргумента?
Как передать функцию в функцию, выполняющую усреднение значения через...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
13
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru