Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 50, средняя оценка - 4.64
Svid
5 / 5 / 1
Регистрация: 02.03.2011
Сообщений: 40
#1

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

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

Добрый день!
Совсем недавно начал изучать С++, в основном по методичке, выданной в ВУЗе и по нескольким книгам (Страуструп Б., Стефан Дэвис) и плюс то, что нахожу в интернете. Практически, всё это привязано к ряду лабораторных и контрольных, которые необходимо сделать.
Дошел до указателей....О_о. Проблема вот в чем: те практические примеры, которые показывают использование указателей, не отвечают на вопрос - зачем? То есть, все что сделано в этих примерах с помощью указателей, можно сделать и без них, и нельзя сказать, что это будет сложнее. Из-за этого очень трудно понять смысл указателей и они для меня пока что пустая абстракция.
Есть ли какие-нибудь простые практические примеры, показывающие... почему без указателей не обойтись? Например, очень легко практически объяснить суть цикла или там функции.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
10.03.2011, 13:35
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Понять указатели:) (C++):

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

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

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

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

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

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

55
silent_1991
Эксперт С++
5006 / 3064 / 149
Регистрация: 11.11.2009
Сообщений: 7,043
Завершенные тесты: 1
12.03.2011, 22:46 #46
Да нет, если что не понятно - спрашивайте))) Просто такое ощущение, что вы в принципе не поняли изначальный смысл того примера, и всё напираете на лишние переменные и и расход памяти зазря.
0
Temirlan90
134 / 134 / 9
Регистрация: 30.09.2010
Сообщений: 333
12.03.2011, 22:52 #47
Просто такое ощущение, что вы в принципе не поняли изначальный смысл того примера
Так оно и есть!!=)) Я сперва вообще не въехал в чем суть, ну да ладно это теперь позади. Ещё раз спасибо=)
0
talis
793 / 545 / 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 аналогичен.
1
Temirlan90
134 / 134 / 9
Регистрация: 30.09.2010
Сообщений: 333
14.03.2011, 16:24 #49
talis, почему функция add не возвращает свои копии в main? Потому что она типа void?
Параметры функции являются локальными переменными этой функции, то есть находятся в её пространстве имён
Или это ответ?
0
instagib
122 / 85 / 3
Регистрация: 14.02.2011
Сообщений: 340
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(целые числа);
в функции действие сложение.
и возращаемое значние - сумма этих двух переменных. т.е. тоже Целое число.
1
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
1
instagib
122 / 85 / 3
Регистрация: 14.02.2011
Сообщений: 340
14.03.2011, 17:05 #52
либо еще проще:
C++
1
cout<<add(2,3);
Добавлено через 26 секунд
dimon1984, можно без дополнительной переменной
1
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
0
Shyrik694
0 / 0 / 0
Регистрация: 14.03.2011
Сообщений: 11
14.03.2011, 17:37 #54
Цитата Сообщение от pepsikat Посмотреть сообщение
Указатели используют для динамического выделения памяти. Ну вот например, есть у Вас какой-либо объект представленный структурой, а сколько этих объектов не известно, т.е. массив использовать нельзя. Вот тут-то и приходят на помощь указатели.

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

Указатели вещь нужная, так что лучше хорошо с ними разберись
Да без указателей не обойтись!ТАк что прийдется разобраться!
0
talis
793 / 545 / 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, наверное, в ужасе...

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

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

Указатели на указатели с числами. Почему можно присвоить число в 4-ый элемент, если массив из 2 элементов? - C++
Есть массив int **mas; mas=new int*; // выделил место под пять строк, верно ? mas=new int;// выделил для первой строки матрицы два...

Есть три переменные. Используя указатели на указатели, поменять значение максимальной и минимальной переменной - C++
Мой код. #include &lt;iostream&gt; #include &lt;stdlib.h&gt; #include&lt;iomanip&gt; using namespace std; void min_max(int*pa, int*pb,...

Отсортировать массив и вывести на экран (массивы и указатели на указатели) - C++
Даны массивы F-фамилий студентов и S-результаты сессии (5 оценок) , причем s- результат сессии F студента. Отсортировать массив S по...


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

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

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