Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.80/15: Рейтинг темы: голосов - 15, средняя оценка - 4.80
2 / 2 / 0
Регистрация: 09.03.2013
Сообщений: 40
1

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

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

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

Например почему лучше нужно объявлять переменные как указатели, почему как обычно нельзя?
То есть не так:
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
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
25.11.2013, 10:43
Ответы с готовыми решениями:

Зачем нужны все эти указатели (или не указатели)
Зачем надо DWORD, HANDLE, LPVOID?

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

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

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

17
5498 / 4893 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
25.11.2013, 10:56 3
Цитата Сообщение от Sabnik Посмотреть сообщение
То есть не так:
Цитата Сообщение от Sabnik Посмотреть сообщение
А вот так:
В первом случае переменная создаётся в динамической памяти, во втором - на стеке (автоматический класс памяти). Разницу, между этими классами памяти, надеюсь, понимаете.
Цитата Сообщение от Sabnik Посмотреть сообщение
Понимаю, что указатели указывают на адрес этой переменной/объекта в памяти, но зачем нам этот адрес?
Хотя бы для того, чтобы иметь доступ к переменной, созданной в динамической памяти.
0
Неэпический
17870 / 10635 / 2054
Регистрация: 27.09.2012
Сообщений: 26,736
Записей в блоге: 1
25.11.2013, 11:00 4
Цитата Сообщение от Sabnik Посмотреть сообщение
но зачем нам этот адрес?
чтобы знать где лежит что-то.
Цитата Сообщение от Sabnik Посмотреть сообщение
Зачем он тоже нужен, не пойму.
адрес объекта, ведь нужно как-то понимать, данные какого объекта читать/изменять
Цитата Сообщение от Sabnik Посмотреть сообщение
зачем нужны указатели?
Указатели
Расскажите популярно про ссылки и указатели
Цитата Сообщение от Sabnik Посмотреть сообщение
Например почему лучше нужно объявлять переменные как указатели, почему как обычно нельзя?
Всё можно! А как именно делать зависит от конкретной задачи.
0
944 / 687 / 230
Регистрация: 28.04.2013
Сообщений: 1,926
25.11.2013, 11:46 5
Указатели довольно сложная тема для "переваривания".
Попробую объяснить один из случаев. (Хотя я про себя еще не могу сказать, что разобрался с указателями до конца)

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

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

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

Если я в чем то не прав, надеюсь более опытные участники меня поправят. Буду очень признателен за дополнения.
0
Неэпический
17870 / 10635 / 2054
Регистрация: 27.09.2012
Сообщений: 26,736
Записей в блоге: 1
25.11.2013, 11:48 6
Цитата Сообщение от reisal78 Посмотреть сообщение
то копия не создается
указатель всё равно копируется.
0
944 / 687 / 230
Регистрация: 28.04.2013
Сообщений: 1,926
25.11.2013, 12:01 7
Цитата Сообщение от Croessmah Посмотреть сообщение
указатель всё равно копируется.
угу, согласен, не подумал об этом. Но ведь, если я правильно понимаю размер указателя зависит от архитектуры, и скажем на 32-битной ОС он будет занимать всего 4 байта, даже если указывает на какую нибудь "тяжелую" структуру?
0
141 / 84 / 24
Регистрация: 21.10.2009
Сообщений: 429
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
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
141 / 84 / 24
Регистрация: 21.10.2009
Сообщений: 429
25.11.2013, 12:19 11
Цитата Сообщение от Sabnik Посмотреть сообщение
Аа, то есть this получается означает примерно такое:
этот par_1 = par_1 из MyClass;
этот par_2 = par_2 из MyClass; ?
В вашем примере this стоит у переменной конструктора или это переменная класса?

Проще говоря this это местоимение класса, таким образом получается, что this стоит перед переменной класса.
0
5498 / 4893 / 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
141 / 84 / 24
Регистрация: 21.10.2009
Сообщений: 429
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
944 / 687 / 230
Регистрация: 28.04.2013
Сообщений: 1,926
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
4064 / 3318 / 924
Регистрация: 25.03.2012
Сообщений: 12,493
Записей в блоге: 1
25.11.2013, 12:26 16
Sabnik, а что по-твоему вообще такое func(*a) ?
По-твоему звёздочку можно просто от балды писать там, где есть что-о похожее на указаель?
И вообще, даже при работе с указателями звёздочка играет разную роль.

int *a; звёздочка просто часть типа объявляемой переменной, тип у переменной int*
*a='1'; звёздочка это оператор разадресации, возвращающий те данные(ту переменную), на которые указывает указатель!
char a это вообще не указатель! Это локальная переменая из другой функции! (Надеюсь, в областях видимости ты так же не путаешься?)
0
1130 / 789 / 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
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
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
26.11.2013, 18:48
Помогаю со студенческими работами здесь

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

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

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

Тема указатели, зачем они нужны
Для чего придумали указатели.... Добавлено через 1 минуту для того, что бы передавать адрес...


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

Или воспользуйтесь поиском по форуму:
18
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru