Форум программистов, компьютерный форум CyberForum.ru

Понять указатели:) - C++

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 50, средняя оценка - 4.64
Svid
 Аватар для Svid
5 / 5 / 1
Регистрация: 02.03.2011
Сообщений: 40
10.03.2011, 13:35     Понять указатели:) #1
Добрый день!
Совсем недавно начал изучать С++, в основном по методичке, выданной в ВУЗе и по нескольким книгам (Страуструп Б., Стефан Дэвис) и плюс то, что нахожу в интернете. Практически, всё это привязано к ряду лабораторных и контрольных, которые необходимо сделать.
Дошел до указателей....О_о. Проблема вот в чем: те практические примеры, которые показывают использование указателей, не отвечают на вопрос - зачем? То есть, все что сделано в этих примерах с помощью указателей, можно сделать и без них, и нельзя сказать, что это будет сложнее. Из-за этого очень трудно понять смысл указателей и они для меня пока что пустая абстракция.
Есть ли какие-нибудь простые практические примеры, показывающие... почему без указателей не обойтись? Например, очень легко практически объяснить суть цикла или там функции.
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Temirlan90
 Аватар для Temirlan90
131 / 131 / 8
Регистрация: 30.09.2010
Сообщений: 333
12.03.2011, 22:28     Понять указатели:) #41
silent_1991, просто Я не до конца въезжаю в Ваш пример=)
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
silent_1991
Эксперт C++
4938 / 3014 / 149
Регистрация: 11.11.2009
Сообщений: 7,024
Завершенные тесты: 1
12.03.2011, 22:31     Понять указатели:) #42
Что конкретно не понятно?
Temirlan90
 Аватар для Temirlan90
131 / 131 / 8
Регистрация: 30.09.2010
Сообщений: 333
12.03.2011, 22:31     Понять указатели:) #43
Svid, написал
1) В случае использования передачи параметров в виде переменных, аргументам функции присваивается значение передаваемых переменных, тем самым создавая новые переменные, область видимости которых - функция. И меняются значения созданных внутри функции переменных, а значения переменных, передаваемых аргументами никак не изменяется, ибо они лишь однажды передали свои значения для переменных функции.
получается в image_swap точнее её аргументы не возвращаются в main() функцию?
silent_1991
Эксперт C++
4938 / 3014 / 149
Регистрация: 11.11.2009
Сообщений: 7,024
Завершенные тесты: 1
12.03.2011, 22:35     Понять указатели:) #44
Да суть этого примера в том, чтобы показать, что когда в функцию передаются сами переменные, то все изменения, которые в этой функции над её параметрами совершаются, не коснутся фактических параметров, переданных вызывающей функцией в вызываемую, а когда используются указатели, тут уже все изменения отражаются на фактических параметрах, поскольку передаются их адреса. Тут не стояла цель показать нецелесообразность или расточительность в плане ресурсов.
Temirlan90
 Аватар для Temirlan90
131 / 131 / 8
Регистрация: 30.09.2010
Сообщений: 333
12.03.2011, 22:44     Понять указатели:) #45
silent_1991, походу Я Вас в конец ДОСТАЛ вопросами, но зато понял что вы хотели сказать тем исходником =)
silent_1991
Эксперт C++
4938 / 3014 / 149
Регистрация: 11.11.2009
Сообщений: 7,024
Завершенные тесты: 1
12.03.2011, 22:46     Понять указатели:) #46
Да нет, если что не понятно - спрашивайте))) Просто такое ощущение, что вы в принципе не поняли изначальный смысл того примера, и всё напираете на лишние переменные и и расход памяти зазря.
Temirlan90
 Аватар для Temirlan90
131 / 131 / 8
Регистрация: 30.09.2010
Сообщений: 333
12.03.2011, 22:52     Понять указатели:) #47
Просто такое ощущение, что вы в принципе не поняли изначальный смысл того примера
Так оно и есть!!=)) Я сперва вообще не въехал в чем суть, ну да ладно это теперь позади. Ещё раз спасибо=)
talis
 Аватар для talis
789 / 541 / 37
Регистрация: 11.05.2010
Сообщений: 1,298
Записей в блоге: 1
13.03.2011, 22:57     Понять указатели:) #48
Извините, что так внезапно исчез - инет весь день не работал.

Temirlan90, на счёт передачи параметров в функцию. Параметры функции являются локальными переменными этой функции, то есть находятся в её пространстве имён:

C++
1
2
3
4
void bar( int a, int b )
{
   //a и b находятся в этом пространстве имён
}
Когда вы вызываете функцию и передаёте ей параметры, создаются локальные переменные для этих параметров, и значения, которые вы передали, копируются в эти локальные переменные. То есть, если я сделаю:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
void add( int a, int b )
{
   a = a + b;
}
 
int main()
{
   int main_a = 15;
 
   add( main_a, 15 );
   cout << main_a << endl;
 
   return 0;
}
... переменная main_a не изменится, так как её значение скопируется в переменную int a пространства имён функции add(). Если вы хотите изменить какую-то переменную, передайте функции адрес этой переменной (через указатель или ссылку):

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
void add( int * a, int * b )
{
   *a = *a + *b; //разыменовывание указателей
}
 
int main()
{
   int main_a = 15;
   int main_b = 25;
 
   add( &main_a, &main_b ); //передача адресов
   cout << main_a << endl;
 
   return 0;
}
В этом случае в локальные переменные int * a и int * b скопируются адреса переменных main_a и main_b, а функция add, беря эти адреса, будет изменять значения, которые лежат по этим адресам, то есть переменные main_a и main_b.

Пример с image_swap аналогичен.
Temirlan90
 Аватар для Temirlan90
131 / 131 / 8
Регистрация: 30.09.2010
Сообщений: 333
14.03.2011, 16:24     Понять указатели:) #49
talis, почему функция add не возвращает свои копии в main? Потому что она типа void?
Параметры функции являются локальными переменными этой функции, то есть находятся в её пространстве имён
Или это ответ?
instagib
122 / 85 / 3
Регистрация: 14.02.2011
Сообщений: 341
14.03.2011, 16:27     Понять указатели:) #50
Temirlan90, да

все функции построены в виде:

\тип возвращаемего значния\ + имя функции + (аргументы)

{
\список действий
\ и return возвращаемое значение ;

}

к примеру


а функции типа void
означают что нет возвращаемого значния.. к примеру:

C++
1
2
3
4
void typetext(string s)
{
cout<<s;
}
в данном примитивном примере функция принимает аргумент стринг и печатает ее на экран, значения никакого не возвращает.
все функции кроме типа void должны возвращать значние согласно типу объявления


C++
1
2
3
4
int add(int x, int y)
{
return x+y;
}
тип возарвщаемого значения - целое.
аргументы поступающие в функцию - x и y(целые числа);
в функции действие сложение.
и возращаемое значние - сумма этих двух переменных. т.е. тоже Целое число.
dimon1984
40 / 38 / 0
Регистрация: 22.01.2011
Сообщений: 670
14.03.2011, 16:44     Понять указатели:) #51
и если есть return в функции, то можно делать такие выражения:
C++
1
2
3
int i=add(2,3);
cout<< i <<endl;
>>  5
instagib
122 / 85 / 3
Регистрация: 14.02.2011
Сообщений: 341
14.03.2011, 17:05     Понять указатели:) #52
либо еще проще:
C++
1
cout<<add(2,3);
Добавлено через 26 секунд
dimon1984, можно без дополнительной переменной
dimon1984
40 / 38 / 0
Регистрация: 22.01.2011
Сообщений: 670
14.03.2011, 17:37     Понять указатели:) #53
и поддержу, ещё вот:
C++
1
2
cout<<add(2,3) + add(2,3);
>>  10
Shyrik694
0 / 0 / 0
Регистрация: 14.03.2011
Сообщений: 11
14.03.2011, 17:37     Понять указатели:) #54
Цитата Сообщение от pepsikat Посмотреть сообщение
Указатели используют для динамического выделения памяти. Ну вот например, есть у Вас какой-либо объект представленный структурой, а сколько этих объектов не известно, т.е. массив использовать нельзя. Вот тут-то и приходят на помощь указатели.

Допустим тебе необходимо из функции массив вернуть, или наоборот в функцию массив из 1000000 float'ов передать. Через параметр - накладно. Нудо использовать указатель на массив.

Указатели вещь нужная, так что лучше хорошо с ними разберись
Да без указателей не обойтись!ТАк что прийдется разобраться!
talis
 Аватар для talis
789 / 541 / 37
Регистрация: 11.05.2010
Сообщений: 1,298
Записей в блоге: 1
14.03.2011, 17:53     Понять указатели:) #55
Цитата Сообщение от Temirlan90 Посмотреть сообщение
talis, почему функция add не возвращает свои копии в main? Потому что она типа void?
В общем да, вам уже ответили, и ответили правильно. Единственное - функции не возвращают свои КОПИИ, они возвращают какие-то значения (если они не void).

Добавлено через 3 минуты
Однако в void-функциях инструкция return используется для досрочного завершения выполнения:

C++
1
2
3
4
5
6
7
8
void cstrOut( char * cstr )
{
   if( cstr == 0 || strlen( cstr ) == 0 )
      return; //вот пример
 
   cout << "C String (" << strlen( cstr ) << "):\n"
       << cstr << "\n=== END OF C STRING ===" << endl;
}
Добавлено через 1 минуту

Не по теме:

Topic Starter, наверное, в ужасе...

MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
15.03.2011, 13:17     Понять указатели:)
Еще ссылки по теме:

Стек на основе массива структур - эт как понять читаю литературу и не могу понять! C++
C++ Написать программу сортировки через указатели на указатели
C++ Символьные литералы, указатели и функция. Не могу понять, почему именно так

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

Или воспользуйтесь поиском по форуму:
Svid
 Аватар для Svid
5 / 5 / 1
Регистрация: 02.03.2011
Сообщений: 40
15.03.2011, 13:17  [ТС]     Понять указатели:) #56
Topic Starter, наверное, в ужасе...
На самом деле - нет, я очень внимательно читаю, потому как, действительно тема начинает плавно трансформироваться в
Понять С++
, а именно этим я сейчас и занят..
Так что еще раз большое всем спасибо, и особенно talis!
Кстати, после проблемы с указателями понял, что методичка мне не поможет, а Страуструп явно требует какого-то начального уровня, которого у меня пока нет, приобрел Лафоре "ООП в С++" - рекомендую таким же гуманитариям как я - ну очень доступно объясняет ( и что характерно - указатели там появляются уже после структур, функций, объектов-классов, массивов, перегрузки операций и наследования..).
Yandex
Объявления
15.03.2011, 13:17     Понять указатели:)
Ответ Создать тему
Опции темы

Текущее время: 20:24. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru