Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.70/56: Рейтинг темы: голосов - 56, средняя оценка - 4.70
 Аватар для Svid
5 / 5 / 2
Регистрация: 02.03.2011
Сообщений: 40

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

10.03.2011, 13:35. Показов 12053. Ответов 55
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Добрый день!
Совсем недавно начал изучать С++, в основном по методичке, выданной в ВУЗе и по нескольким книгам (Страуструп Б., Стефан Дэвис) и плюс то, что нахожу в интернете. Практически, всё это привязано к ряду лабораторных и контрольных, которые необходимо сделать.
Дошел до указателей....О_о. Проблема вот в чем: те практические примеры, которые показывают использование указателей, не отвечают на вопрос - зачем? То есть, все что сделано в этих примерах с помощью указателей, можно сделать и без них, и нельзя сказать, что это будет сложнее. Из-за этого очень трудно понять смысл указателей и они для меня пока что пустая абстракция.
Есть ли какие-нибудь простые практические примеры, показывающие... почему без указателей не обойтись? Например, очень легко практически объяснить суть цикла или там функции.
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
10.03.2011, 13:35
Ответы с готовыми решениями:

Указатели не могу понять
Все вопросы указал в комментариях к коду. Не могу понять почему так #include <iostream> using namespace std; int main() { ...

Не могу понять зачем нужны указатели?
Не как не могу понять зачем нужны указатели. Я знаю что их надо использовать для выделения памяти, но раньше я и без них обходился

Строки (массив char), указатели. Не могу понять логику! Help!
Вообщем проблема в том что выводятся лишние символы в строках.. хотя в них есть признак окончания строк - нулевой байт я новичок в С...

55
 Аватар для Temirlan90
137 / 137 / 25
Регистрация: 30.09.2010
Сообщений: 333
12.03.2011, 22:28
Студворк — интернет-сервис помощи студентам
silent_1991, просто Я не до конца въезжаю в Ваш пример=)
0
Эксперт С++
5058 / 3118 / 271
Регистрация: 11.11.2009
Сообщений: 7,044
12.03.2011, 22:31
Что конкретно не понятно?
0
 Аватар для Temirlan90
137 / 137 / 25
Регистрация: 30.09.2010
Сообщений: 333
12.03.2011, 22:31
Svid, написал
1) В случае использования передачи параметров в виде переменных, аргументам функции присваивается значение передаваемых переменных, тем самым создавая новые переменные, область видимости которых - функция. И меняются значения созданных внутри функции переменных, а значения переменных, передаваемых аргументами никак не изменяется, ибо они лишь однажды передали свои значения для переменных функции.
получается в image_swap точнее её аргументы не возвращаются в main() функцию?
0
Эксперт С++
5058 / 3118 / 271
Регистрация: 11.11.2009
Сообщений: 7,044
12.03.2011, 22:35
Да суть этого примера в том, чтобы показать, что когда в функцию передаются сами переменные, то все изменения, которые в этой функции над её параметрами совершаются, не коснутся фактических параметров, переданных вызывающей функцией в вызываемую, а когда используются указатели, тут уже все изменения отражаются на фактических параметрах, поскольку передаются их адреса. Тут не стояла цель показать нецелесообразность или расточительность в плане ресурсов.
1
 Аватар для Temirlan90
137 / 137 / 25
Регистрация: 30.09.2010
Сообщений: 333
12.03.2011, 22:44
silent_1991, походу Я Вас в конец ДОСТАЛ вопросами, но зато понял что вы хотели сказать тем исходником =)
0
Эксперт С++
5058 / 3118 / 271
Регистрация: 11.11.2009
Сообщений: 7,044
12.03.2011, 22:46
Да нет, если что не понятно - спрашивайте))) Просто такое ощущение, что вы в принципе не поняли изначальный смысл того примера, и всё напираете на лишние переменные и и расход памяти зазря.
0
 Аватар для Temirlan90
137 / 137 / 25
Регистрация: 30.09.2010
Сообщений: 333
12.03.2011, 22:52
Просто такое ощущение, что вы в принципе не поняли изначальный смысл того примера
Так оно и есть!!=)) Я сперва вообще не въехал в чем суть, ну да ладно это теперь позади. Ещё раз спасибо=)
0
 Аватар для talis
794 / 546 / 61
Регистрация: 11.05.2010
Сообщений: 1,298
Записей в блоге: 1
13.03.2011, 22:57
Извините, что так внезапно исчез - инет весь день не работал.

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 аналогичен.
1
 Аватар для Temirlan90
137 / 137 / 25
Регистрация: 30.09.2010
Сообщений: 333
14.03.2011, 16:24
talis, почему функция add не возвращает свои копии в main? Потому что она типа void?
Параметры функции являются локальными переменными этой функции, то есть находятся в её пространстве имён
Или это ответ?
0
122 / 85 / 16
Регистрация: 14.02.2011
Сообщений: 340
14.03.2011, 16:27
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(целые числа);
в функции действие сложение.
и возращаемое значние - сумма этих двух переменных. т.е. тоже Целое число.
1
40 / 38 / 5
Регистрация: 22.01.2011
Сообщений: 670
14.03.2011, 16:44
и если есть return в функции, то можно делать такие выражения:
C++
1
2
3
int i=add(2,3);
cout<< i <<endl;
>>  5
1
122 / 85 / 16
Регистрация: 14.02.2011
Сообщений: 340
14.03.2011, 17:05
либо еще проще:
C++
1
cout<<add(2,3);
Добавлено через 26 секунд
dimon1984, можно без дополнительной переменной
1
40 / 38 / 5
Регистрация: 22.01.2011
Сообщений: 670
14.03.2011, 17:37
и поддержу, ещё вот:
C++
1
2
cout<<add(2,3) + add(2,3);
>>  10
0
0 / 0 / 0
Регистрация: 14.03.2011
Сообщений: 11
14.03.2011, 17:37
Цитата Сообщение от pepsikat Посмотреть сообщение
Указатели используют для динамического выделения памяти. Ну вот например, есть у Вас какой-либо объект представленный структурой, а сколько этих объектов не известно, т.е. массив использовать нельзя. Вот тут-то и приходят на помощь указатели.

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

Указатели вещь нужная, так что лучше хорошо с ними разберись
Да без указателей не обойтись!ТАк что прийдется разобраться!
0
 Аватар для talis
794 / 546 / 61
Регистрация: 11.05.2010
Сообщений: 1,298
Записей в блоге: 1
14.03.2011, 17:53
Цитата Сообщение от 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, наверное, в ужасе...

0
 Аватар для Svid
5 / 5 / 2
Регистрация: 02.03.2011
Сообщений: 40
15.03.2011, 13:17  [ТС]
Topic Starter, наверное, в ужасе...
На самом деле - нет, я очень внимательно читаю, потому как, действительно тема начинает плавно трансформироваться в
Понять С++
, а именно этим я сейчас и занят..
Так что еще раз большое всем спасибо, и особенно talis!
Кстати, после проблемы с указателями понял, что методичка мне не поможет, а Страуструп явно требует какого-то начального уровня, которого у меня пока нет, приобрел Лафоре "ООП в С++" - рекомендую таким же гуманитариям как я - ну очень доступно объясняет ( и что характерно - указатели там появляются уже после структур, функций, объектов-классов, массивов, перегрузки операций и наследования..).
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
15.03.2011, 13:17

Символьные литералы, указатели и функция. Не могу понять, почему именно так
Доброго времени суток всем! :) Изучаю С++, всегда стараюсь добить до последнего код, чтобы не было непоняток. Но сейчас наткнулся на...

Не могу понять, как "живут" файловые указатели
Не могу понять как живут файловые указатели... Есть у меня файл, и пишу в него 100 интов. Указатель ввода сдвигается на 400, так и надо....

Указатели и указатели на указатели, а также типы данных
Недавно начал изучать Си, перешел с Delphi. Много непонятного и пока процесс идет медленно. Накачал литературы, буду изучать) Щас...

Через указатели на указатели посчитать сумму двух чисел и записать в третье
1. Через указатели на указатели посчитать сумму двух чисел и записать в третье. 2. Написать примитивный калькулятор, пользуясь только...

Почему Лафоре использует указатели на указатели, вместо обмена значениями указателей?
Доброго времени суток! Задался теоретическим вопросом. Читал пример из книги Лафоре ОБЪЕКТНО-ОРИЕНТИРОВАННОЕ ПРОГРАММИРОВАНИЕ В C++,...


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

Или воспользуйтесь поиском по форуму:
56
Ответ Создать тему
Новые блоги и статьи
Вступаем в новую фазу генерации favicons, векторную.
russiannick 02.11.2026
Теперь нет нужды скрывать что используется простой svg. Исходный код изображения помещаем в поле и жмем кнопку. Исходник преобразуется в вид корректный для помещения в favicon или в url(). Нажатие. . .
Генератор паролей (вариант №4)
Maks 01.11.2026
После публикации 3-го варианта генератора паролей, разослал его своим коллегам (с целью оценки), в итоге были получены следующие рекомендации: 1. Вернуть возможность использования знаков | 1 l I;. . .
Генератор паролей (вариант №3)
Maks 30.10.2026
Финальная версия генератора паролей 1С. Доработка решения в этот раз коснулась только визуальной части, а именно, добавлен реквизит ДопПараметры (тип Булево), который скрывает/ отображает реквизиты:. . .
Магическое мышление и магия, современная наука не отличима от магии (говорит ИИ Джемени)
zorxor 30.10.2026
Джемени, расскажи, пожалуйста, что такое магическое мышление, что такое магия, почему современная наука чем-то напоминает магию? Фраза «Любая достаточно развитая технология неотличима от магии». . .
За какое время ИИ может подобрать пароль по хешу (рассказывает Джемени ИИ)
zorxor 30.10.2026
Расскажи, Джемени, если известен хэш МД5, например, за сколько ИИ сможет подобрать соответствующий пароль? Искусственный интеллект (ИИ) может подобрать простой или средний по сложности пароль по. . .
Кто убил Suno? Почему наше солнышко погасло? (диалог с ИИ Джемени)
zorxor 30.10.2026
Как убивали Suno. Хронология. «Убийство» музыкальной нейросети Suno — это затяжной процесс, в котором технологический хайп стартапа разбился о жесткую реальность судебных исков от гигантов. . .
Генератор паролей (вариант №2)
Maks 30.10.2026
Обновленная версия ранее созданной обработки. Добавлены следующие реквизиты типа Булево: - Буквы; - Цифры; - Символы. Изменена логика команды "Сгенерировать" и процедуры "ПриОткрытии":. . .
Генератор паролей (вариант №1)
Maks 29.10.2026
Реализация из решения ниже выполнена исключительно по моей инициативе, дабы облегчить себе работу в создании паролей для администрируемых мною сервисов и пользователей. Самым главным критерием для. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru