Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 5.00/7: Рейтинг темы: голосов - 7, средняя оценка - 5.00
Sabnik
2 / 2 / 0
Регистрация: 09.03.2013
Сообщений: 40
#1

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

25.11.2013, 10:43. Просмотров 1196. Ответов 17
Метки нет (Все метки)

Интересует вопрос, зачем нужны указатели?

Например почему лучше нужно объявлять переменные как указатели, почему как обычно нельзя?
То есть не так:
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. Зачем он тоже нужен, не пойму.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
25.11.2013, 10:43
Ответы с готовыми решениями:

Указатели на слонов или А зачем нужны указатели?
Знаю что таких вопросов было уйма, но я так и не нашел ответа на свой вопрос....

Зачем нужны указатели
Не могу понять синтаксис указателей. Понял, что это работа с адресами, что...

Зачем нужны многоуровневые указатели
вопрос в названии темы

Зачем здесь нужны указатели
1. Через указатели на указатели посчитать сумму двух чисел и записать в третье....

Объясните, пожалуйста, зачем в C++ нужны указатели
Никак что-то не пойму, зачем в C++ указатели? Ведь можно спокойно...

17
alsav22
5441 / 4836 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
25.11.2013, 10:56 #3
Цитата Сообщение от Sabnik Посмотреть сообщение
То есть не так:
Цитата Сообщение от Sabnik Посмотреть сообщение
А вот так:
В первом случае переменная создаётся в динамической памяти, во втором - на стеке (автоматический класс памяти). Разницу, между этими классами памяти, надеюсь, понимаете.
Цитата Сообщение от Sabnik Посмотреть сообщение
Понимаю, что указатели указывают на адрес этой переменной/объекта в памяти, но зачем нам этот адрес?
Хотя бы для того, чтобы иметь доступ к переменной, созданной в динамической памяти.
0
Croessmah
++Ͻ
14506 / 8288 / 1556
Регистрация: 27.09.2012
Сообщений: 20,340
Записей в блоге: 3
Завершенные тесты: 1
25.11.2013, 11:00 #4
Цитата Сообщение от Sabnik Посмотреть сообщение
но зачем нам этот адрес?
чтобы знать где лежит что-то.
Цитата Сообщение от Sabnik Посмотреть сообщение
Зачем он тоже нужен, не пойму.
адрес объекта, ведь нужно как-то понимать, данные какого объекта читать/изменять
Цитата Сообщение от Sabnik Посмотреть сообщение
зачем нужны указатели?
Указатели
Расскажите популярно про ссылки и указатели
Цитата Сообщение от Sabnik Посмотреть сообщение
Например почему лучше нужно объявлять переменные как указатели, почему как обычно нельзя?
Всё можно! А как именно делать зависит от конкретной задачи.
0
reisal78
894 / 645 / 218
Регистрация: 28.04.2013
Сообщений: 1,845
25.11.2013, 11:46 #5
Указатели довольно сложная тема для "переваривания".
Попробую объяснить один из случаев. (Хотя я про себя еще не могу сказать, что разобрался с указателями до конца)

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

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

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

Если я в чем то не прав, надеюсь более опытные участники меня поправят. Буду очень признателен за дополнения.
0
Croessmah
++Ͻ
14506 / 8288 / 1556
Регистрация: 27.09.2012
Сообщений: 20,340
Записей в блоге: 3
Завершенные тесты: 1
25.11.2013, 11:48 #6
Цитата Сообщение от reisal78 Посмотреть сообщение
то копия не создается
указатель всё равно копируется.
0
reisal78
894 / 645 / 218
Регистрация: 28.04.2013
Сообщений: 1,845
25.11.2013, 12:01 #7
Цитата Сообщение от Croessmah Посмотреть сообщение
указатель всё равно копируется.
угу, согласен, не подумал об этом. Но ведь, если я правильно понимаю размер указателя зависит от архитектуры, и скажем на 32-битной ОС он будет занимать всего 4 байта, даже если указывает на какую нибудь "тяжелую" структуру?
0
mibin
58 / 56 / 11
Регистрация: 21.10.2009
Сообщений: 302
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, то мы потеряли бы из области видимости переменные класса, так как в конструкторе объявлены переменные с такими же именами.
0
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 стоит у переменной конструктора или это переменная класса?
0
newbie666
25.11.2013, 12:18
  #10

Не по теме:

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

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

Проще говоря this это местоимение класса, таким образом получается, что this стоит перед переменной класса.
0
alsav22
5441 / 4836 / 831
Регистрация: 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;
   }
}
1
mibin
58 / 56 / 11
Регистрация: 21.10.2009
Сообщений: 302
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 расслабляет
0
reisal78
894 / 645 / 218
Регистрация: 28.04.2013
Сообщений: 1,845
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;
}
0
Croessmah
25.11.2013, 12:25
  #15

Не по теме:

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

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

int *a; звёздочка просто часть типа объявляемой переменной, тип у переменной int*
*a='1'; звёздочка это оператор разадресации, возвращающий те данные(ту переменную), на которые указывает указатель!
char a это вообще не указатель! Это локальная переменая из другой функции! (Надеюсь, в областях видимости ты так же не путаешься?)
0
Alex5
1122 / 783 / 232
Регистрация: 12.04.2010
Сообщений: 2,012
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;
 }
0
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;
 }
Я знаю.
0
26.11.2013, 18:48
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
26.11.2013, 18:48

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

Для чего нужны и зачем использовать smart-указатели?
В Страуструпе не нашел, кто подскжает где можно про них прочитать ?)

Зачем биты нужны это меньше байтов но int 32 бита но я не допер зачем это нужно это 4 байта то есть int не может больше 4 байт весить?
Вот еще один вопрос зачем биты нужны это меньше байтов но int 32 бита но я не...


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

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

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