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

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

Войти
Регистрация
Восстановить пароль
 
 
Sabnik
2 / 2 / 0
Регистрация: 09.03.2013
Сообщений: 40
#1

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

25.11.2013, 10:43. Просмотров 1107. Ответов 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
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Зачем нужны указатели? (C++):

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

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

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

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

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

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

17
alsav22
5428 / 4823 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
25.11.2013, 10:56 #3
Цитата Сообщение от Sabnik Посмотреть сообщение
То есть не так:
Цитата Сообщение от Sabnik Посмотреть сообщение
А вот так:
В первом случае переменная создаётся в динамической памяти, во втором - на стеке (автоматический класс памяти). Разницу, между этими классами памяти, надеюсь, понимаете.
Цитата Сообщение от Sabnik Посмотреть сообщение
Понимаю, что указатели указывают на адрес этой переменной/объекта в памяти, но зачем нам этот адрес?
Хотя бы для того, чтобы иметь доступ к переменной, созданной в динамической памяти.
0
Croessmah
Ушел
Эксперт CЭксперт С++
13558 / 7708 / 872
Регистрация: 27.09.2012
Сообщений: 18,996
Записей в блоге: 3
Завершенные тесты: 1
25.11.2013, 11:00 #4
Цитата Сообщение от Sabnik Посмотреть сообщение
но зачем нам этот адрес?
чтобы знать где лежит что-то.
Цитата Сообщение от Sabnik Посмотреть сообщение
Зачем он тоже нужен, не пойму.
адрес объекта, ведь нужно как-то понимать, данные какого объекта читать/изменять
Цитата Сообщение от Sabnik Посмотреть сообщение
зачем нужны указатели?
Указатели
Расскажите популярно про ссылки и указатели
Цитата Сообщение от Sabnik Посмотреть сообщение
Например почему лучше нужно объявлять переменные как указатели, почему как обычно нельзя?
Всё можно! А как именно делать зависит от конкретной задачи.
0
reisal78
677 / 589 / 139
Регистрация: 28.04.2013
Сообщений: 1,678
25.11.2013, 11:46 #5
Указатели довольно сложная тема для "переваривания".
Попробую объяснить один из случаев. (Хотя я про себя еще не могу сказать, что разобрался с указателями до конца)

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

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

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

Если я в чем то не прав, надеюсь более опытные участники меня поправят. Буду очень признателен за дополнения.
0
Croessmah
Ушел
Эксперт CЭксперт С++
13558 / 7708 / 872
Регистрация: 27.09.2012
Сообщений: 18,996
Записей в блоге: 3
Завершенные тесты: 1
25.11.2013, 11:48 #6
Цитата Сообщение от reisal78 Посмотреть сообщение
то копия не создается
указатель всё равно копируется.
0
reisal78
677 / 589 / 139
Регистрация: 28.04.2013
Сообщений: 1,678
25.11.2013, 12:01 #7
Цитата Сообщение от Croessmah Посмотреть сообщение
указатель всё равно копируется.
угу, согласен, не подумал об этом. Но ведь, если я правильно понимаю размер указателя зависит от архитектуры, и скажем на 32-битной ОС он будет занимать всего 4 байта, даже если указывает на какую нибудь "тяжелую" структуру?
0
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, то мы потеряли бы из области видимости переменные класса, так как в конструкторе объявлены переменные с такими же именами.
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 Посмотреть сообщение
зачем нужны указатели?
чтоб ты спросил

0
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 стоит перед переменной класса.
0
alsav22
5428 / 4823 / 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;
   }
}
1
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 расслабляет
0
reisal78
677 / 589 / 139
Регистрация: 28.04.2013
Сообщений: 1,678
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 Посмотреть сообщение
чтоб ты спросил
или что бы ты ответил

1
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
25.11.2013, 12:25
Привет! Вот еще темы с ответами:

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

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

Зачем нужны макросы? - C++
Зачем нужны макросы?

Зачем нужны классы? - C++
Изучаю СИ++ после изучения СИ. Не пойму какой смысл в классах. То что они делают можно реализовать с помощью функций, структур и обычных...


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

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

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