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

Зачем нужны указатели? - C++

Восстановить пароль Регистрация
 
Sabnik
2 / 2 / 0
Регистрация: 09.03.2013
Сообщений: 40
25.11.2013, 10:43     Зачем нужны указатели? #1
Интересует вопрос, зачем нужны указатели?

Например почему лучше нужно объявлять переменные как указатели, почему как обычно нельзя?
То есть не так:
C++
1
2
int *test = new int;
*test = 5;
А вот так:
C++
1
2
int test;
test = 5
Тоже самое с объектами классов.
Не так
C++
1
2
3
4
5
6
7
8
9
class Test
{
    ...
}
int main()
{
    Test *Object = new Test;
    Object->SetLenght(5);
}
А так
C++
1
2
Test Object;
Object.SetLenght(5);
Понимаю, что указатели указывают на адрес этой переменной/объекта в памяти, но зачем нам этот адрес?

Также сейчас читаю про указатель this. Зачем он тоже нужен, не пойму.
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
25.11.2013, 10:56     Зачем нужны указатели? #3
Цитата Сообщение от Sabnik Посмотреть сообщение
То есть не так:
Цитата Сообщение от Sabnik Посмотреть сообщение
А вот так:
В первом случае переменная создаётся в динамической памяти, во втором - на стеке (автоматический класс памяти). Разницу, между этими классами памяти, надеюсь, понимаете.
Цитата Сообщение от Sabnik Посмотреть сообщение
Понимаю, что указатели указывают на адрес этой переменной/объекта в памяти, но зачем нам этот адрес?
Хотя бы для того, чтобы иметь доступ к переменной, созданной в динамической памяти.
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11841 / 6820 / 771
Регистрация: 27.09.2012
Сообщений: 16,911
Записей в блоге: 2
Завершенные тесты: 1
25.11.2013, 11:00     Зачем нужны указатели? #4
Цитата Сообщение от Sabnik Посмотреть сообщение
но зачем нам этот адрес?
чтобы знать где лежит что-то.
Цитата Сообщение от Sabnik Посмотреть сообщение
Зачем он тоже нужен, не пойму.
адрес объекта, ведь нужно как-то понимать, данные какого объекта читать/изменять
Цитата Сообщение от Sabnik Посмотреть сообщение
зачем нужны указатели?
Указатели
Расскажите популярно про ссылки и указатели
Цитата Сообщение от Sabnik Посмотреть сообщение
Например почему лучше нужно объявлять переменные как указатели, почему как обычно нельзя?
Всё можно! А как именно делать зависит от конкретной задачи.
reisal78
 Аватар для reisal78
603 / 516 / 119
Регистрация: 28.04.2013
Сообщений: 1,451
25.11.2013, 11:46     Зачем нужны указатели? #5
Указатели довольно сложная тема для "переваривания".
Попробую объяснить один из случаев. (Хотя я про себя еще не могу сказать, что разобрался с указателями до конца)

Представим такой случай.

Вы из функции main вызываете функцию int temp (int i) которая, скажем, будет увеличивать переданную переменную на 1.
При вызове функции temp в памяти будет создана копия переданной переменной i, с этой копией будут произведены какие то действия (в моем примере увеличится на 1), модифицированное значение будет возвращено и присвоено какой то переменной.
Если же вы передаете в функцию адрес переменной, которую хотите модифицировать то копия не создается, действия модификации внутри функции производятся над самой переменной, возвращать ее нет необходимости.

Для большого кол-ва данных и большого объёма профит очевиден.

Если я в чем то не прав, надеюсь более опытные участники меня поправят. Буду очень признателен за дополнения.
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11841 / 6820 / 771
Регистрация: 27.09.2012
Сообщений: 16,911
Записей в блоге: 2
Завершенные тесты: 1
25.11.2013, 11:48     Зачем нужны указатели? #6
Цитата Сообщение от reisal78 Посмотреть сообщение
то копия не создается
указатель всё равно копируется.
reisal78
 Аватар для reisal78
603 / 516 / 119
Регистрация: 28.04.2013
Сообщений: 1,451
25.11.2013, 12:01     Зачем нужны указатели? #7
Цитата Сообщение от Croessmah Посмотреть сообщение
указатель всё равно копируется.
угу, согласен, не подумал об этом. Но ведь, если я правильно понимаю размер указателя зависит от архитектуры, и скажем на 32-битной ОС он будет занимать всего 4 байта, даже если указывает на какую нибудь "тяжелую" структуру?
mibin
49 / 49 / 4
Регистрация: 21.10.2009
Сообщений: 272
25.11.2013, 12:13     Зачем нужны указатели? #8
Также сейчас читаю про указатель this. Зачем он тоже нужен, не пойму.
C++
1
2
3
4
5
6
7
8
9
10
class MyClass {
   int par_1;
   int par_2;
   
   // Конструктор
   MyClass(int par_1, int par_2) {
     this.par_1 = par_1;
     this.par_2 = par_2;
   }
}
В данном случае если бы не было this, то мы потеряли бы из области видимости переменные класса, так как в конструкторе объявлены переменные с такими же именами.
Sabnik
2 / 2 / 0
Регистрация: 09.03.2013
Сообщений: 40
25.11.2013, 12:15  [ТС]     Зачем нужны указатели? #9
Вот пример:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include <iostream>
using namespace std;
 
void func (char* a)
{
     *a = 'l';
     cout << "\nin func a = " << *a;
} 
 
int main(){
    char a = 'H';
    cout << "\nin main a = " << a;
    func (&a);
    cout << "\nafter func a = " << a;
    system ("PAUSE");
    return 0;
 }
Почему тут так func (&a), а не так func (a) или так func (*a)? Почему именно адрес в функцию передаем?

Добавлено через 1 минуту
Цитата Сообщение от mibin Посмотреть сообщение
C++
1
2
3
4
5
6
7
8
9
10
class MyClass {
   int par_1;
   int par_2;
   
   // Конструктор
   MyClass(int par_1, int par_2) {
     this.par_1 = par_1;
     this.par_2 = par_2;
   }
}
В данном случае если бы не было this, то мы потеряли бы из области видимости переменные класса, так как в конструкторе объявлены переменные с такими же именами.
Аа, то есть this получается означает примерно такое:
этот par_1 = par_1 из MyClass;
этот par_2 = par_2 из MyClass; ?
В вашем примере this стоит у переменной конструктора или это переменная класса?
newbie666
25.11.2013, 12:18
  #10

Не по теме:

Цитата Сообщение от Sabnik Посмотреть сообщение
зачем нужны указатели?
чтоб ты спросил

mibin
49 / 49 / 4
Регистрация: 21.10.2009
Сообщений: 272
25.11.2013, 12:19     Зачем нужны указатели? #11
Цитата Сообщение от Sabnik Посмотреть сообщение
Аа, то есть this получается означает примерно такое:
этот par_1 = par_1 из MyClass;
этот par_2 = par_2 из MyClass; ?
В вашем примере this стоит у переменной конструктора или это переменная класса?

Проще говоря this это местоимение класса, таким образом получается, что this стоит перед переменной класса.
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
25.11.2013, 12:20     Зачем нужны указатели? #12
mibin, this - это указатель, а не объект, поэтому:
C++
1
2
3
4
5
6
7
8
9
10
class MyClass {
   int par_1;
   int par_2;
   
   // Конструктор
   MyClass(int par_1, int par_2) {
     this ->par_1 = par_1;
     this ->par_2 = par_2;
   }
}
mibin
49 / 49 / 4
Регистрация: 21.10.2009
Сообщений: 272
25.11.2013, 12:22     Зачем нужны указатели? #13
Цитата Сообщение от alsav22 Посмотреть сообщение
mibin, this - это указатель, а не объект, поэтому:
C++
1
2
3
4
5
6
7
8
9
10
class MyClass {
   int par_1;
   int par_2;
   
   // Конструктор
   MyClass(int par_1, int par_2) {
     this ->par_1 = par_1;
     this ->par_2 = par_2;
   }
}
Да, согласен, моя ошибка, потерял навык . Delphi расслабляет
reisal78
 Аватар для reisal78
603 / 516 / 119
Регистрация: 28.04.2013
Сообщений: 1,451
25.11.2013, 12:25     Зачем нужны указатели? #14
Цитата Сообщение от Sabnik Посмотреть сообщение
Вот пример:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include <iostream>
using namespace std;
void func (char* a)
{
*a = 'l';
cout << "\nin func a = " << *a;
} 
int main(){
char a = 'H';
cout << "\nin main a = " << a;
func (&a);
cout << "\nafter func a = " << a;
system ("PAUSE");
return 0;
}
Почему тут так func (&a), а не так func (a) или так func (*a)? Почему именно адрес в функцию передаем?
Конкретно на этом примере профит в избавлении от 2х действий.

Если переписать без использования указателей:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include <iostream>
using namespace std;
char func (char a)
{
     a = 'l';
     cout << "\nin func a = " << a;
     return a; // Добавилось действие
} 
int main(){
char a = 'H';
cout << "\nin main a = " << a;
a = func (a); //Добавилось действие
cout << "\nafter func a = " << a;
system ("PAUSE");
return 0;
}
Croessmah
25.11.2013, 12:25
  #15

Не по теме:

Цитата Сообщение от newbie666 Посмотреть сообщение
чтоб ты спросил
или что бы ты ответил

Kuzia domovenok
 Аватар для Kuzia domovenok
1883 / 1738 / 116
Регистрация: 25.03.2012
Сообщений: 5,907
Записей в блоге: 1
25.11.2013, 12:26     Зачем нужны указатели? #16
Sabnik, а что по-твоему вообще такое func(*a) ?
По-твоему звёздочку можно просто от балды писать там, где есть что-о похожее на указаель?
И вообще, даже при работе с указателями звёздочка играет разную роль.

int *a; звёздочка просто часть типа объявляемой переменной, тип у переменной int*
*a='1'; звёздочка это оператор разадресации, возвращающий те данные(ту переменную), на которые указывает указатель!
char a это вообще не указатель! Это локальная переменая из другой функции! (Надеюсь, в областях видимости ты так же не путаешься?)
Alex5
883 / 618 / 81
Регистрация: 12.04.2010
Сообщений: 1,552
25.11.2013, 16:19     Зачем нужны указатели? #17
Sabnik, Иногда можно запутаться, если использовать одно имя для разных объектов. Параметр функции func() и переменная в функции main() - это не одно и то же. Обозначим их разными буквами - см.пример.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include <iostream>
using namespace std;
 
void func (char* p)
{
     cout << "\n\nin func - begin   p ==  " << (void*)p << "    *p ==  " << *p;
     *p = 'l';
     cout << "\n\nin func - end     p ==  " << (void*)p << "    *p ==  " << *p;
} 
 
int main(){
    char a = 'H';
    //cout << "\n\nin main a == " << a;
    cout << "\n\nin main &a == " << (void*)&a << "   a == " << a;
    func (&a);
    cout << "\n\nafter func a == " << a;
    cout << "\n\n";
    system ("PAUSE");
    return 0;
 }
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
26.11.2013, 18:48     Зачем нужны указатели?
Еще ссылки по теме:

C++ Объясните, пожалуйста, зачем в C++ нужны указатели
зачем нужны многоуровневые указатели C++
C++ Для чего нужны и зачем использовать smart-указатели?

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

Или воспользуйтесь поиском по форуму:
Sabnik
2 / 2 / 0
Регистрация: 09.03.2013
Сообщений: 40
26.11.2013, 18:48  [ТС]     Зачем нужны указатели? #18
Цитата Сообщение от Alex5 Посмотреть сообщение
Sabnik, Иногда можно запутаться, если использовать одно имя для разных объектов. Параметр функции func() и переменная в функции main() - это не одно и то же. Обозначим их разными буквами - см.пример.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include <iostream>
using namespace std;
 
void func (char* p)
{
     cout << "\n\nin func - begin   p ==  " << (void*)p << "    *p ==  " << *p;
     *p = 'l';
     cout << "\n\nin func - end     p ==  " << (void*)p << "    *p ==  " << *p;
} 
 
int main(){
    char a = 'H';
    //cout << "\n\nin main a == " << a;
    cout << "\n\nin main &a == " << (void*)&a << "   a == " << a;
    func (&a);
    cout << "\n\nafter func a == " << a;
    cout << "\n\n";
    system ("PAUSE");
    return 0;
 }
Я знаю.
Yandex
Объявления
26.11.2013, 18:48     Зачем нужны указатели?
Ответ Создать тему
Опции темы

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