Форум: Форум C++Разное
Новые темы: 00
Программирование. Ступени успешной карьеры. Авторы: Кузнецов М.В., Симдянов И.В. Самоучитель MySQL 5. Авторы: Кузнецов М.В., Симдянов И.В. PHP Puzzles. Авторы: Кузнецов М.В., Симдянов И.В. Социальная инженерия и социальные хакеры. Авторы: Кузнецов М.В., Симдянов И.В. MySQL 5. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум C++

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Что такое указатели?
 
 автор: asker++   (18.11.2011 в 14:01)   письмо автору
 
 

Все-таки есть простое объяснение, что такое указатели, а главное зачем они нужны?

  Ответить  
 
 автор: cheops   (18.11.2011 в 15:43)   письмо автору
 
   для: asker++   (18.11.2011 в 14:01)
 

Указатели - это переменные специального типа, которые хранят адрес области памяти. По этому адресу может находиться что угодно, переменная, массив, объект, картинка, таблица других указателей и даже функция. Причем на одну и ту же область может ссылаться сразу несколько указателей, адреса в них можно присваивать другим указателям или передавать их в качестве параметров функций. Это очень выгодно, вместо того, чтобы копировать мегабайтный кусок памяти, вы копируете обычную переменную размером в 4 байта и тем не менее имеете возможность оперировать с этим мегабайтным куском в любом месте, куда вы переслали указатель. В случае же функции вы получаете возможность передавать в другую функцию указатель на любую другую функцию (т.е. получаете возможность гибко изменять логику программы, путем передачи для вызова различных функций).

При работе с указателями сложность вызывает то, что вы можете обращаться как к адресу, так и к значению, путем разименования указателя, а также то, что указателю нужно передавать адрес (а не значение), который необходимо получать при помощи оператора &
#include <stdio.h>
#include <iostream>
using namespace std;

// Главная функция
int main()
{
   // Переменная
   int i = 200;
   // Указатель
   int *ptr;
   // Помещаем в указатель адрес переменной i
   ptr = &i;
   // Обращение к значению i через указатель
   cout << "*ptr = " << *ptr << endl;
   // Адрес, который хранится в указателе
   cout << "ptr = " << ptr << endl;
   // Пауза перед закрытием
   system("PAUSE");
   return 0;
 }

Другой сложностью является то, что указатели могут ссылаться на другие указатели и зачастую может получаться целая цепочка ссылок p1 -> p2 -> p3 и т.п.

PS Ну и совсем весело начинается, при работе с указателями на объекты, которые сами по себе довольно сложные конструкции...

  Ответить  
 
 автор: asker++   (18.11.2011 в 17:52)   письмо автору
 
   для: cheops   (18.11.2011 в 15:43)
 

Спасибо, получается это типа файловых ссылок в Линуксе? Так вроде в C++ для этого есть ссылки? Указатели и ссылики это одно и тоже?

  Ответить  
 
 автор: cheops   (18.11.2011 в 18:30)   письмо автору
 
   для: asker++   (18.11.2011 в 17:52)
 

>Спасибо, получается это типа файловых ссылок в Линуксе?
Да, идея похожая, причем тут речь скорее следует вести о жестких ссылках.

>Так вроде в C++ для этого есть ссылки? Указатели и ссылики это одно и тоже?
Кстати, нет. Ссылки - это отдельный тип данных, они выполняют схожие функции, но для их создания не нужно получать адрес области памяти при помощи & - они делают это автоматически. Плюс они обладают рядом ограничений, которые делают код с использованием более безопасным. Тут вот какая ситуация, сначала в C появились указатели, а потом уже в C++ появился ссылочный тип, однако, указатели не стали убирать, чтобы сохранить обратную совместимость (да и нужны они в системном коде).

  Ответить  
 
 автор: asker++   (18.11.2011 в 19:41)   письмо автору
 
   для: cheops   (18.11.2011 в 18:30)
 

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

  Ответить  
 
 автор: cheops   (18.11.2011 в 20:39)   письмо автору
 
   для: asker++   (18.11.2011 в 19:41)
 

Разница собственно только в форме использования, чтобы добраться до значения, на которое ссылается ссылка не нужно никаких дополнительных операторов - просто можно использовать имя ссылки, как имя переменной. Ну и плюс ко всему, нельзя держать неинициализированную ссылку, она обязательно должна ссылаться на объект.
#include <stdio.h>
#include <iostream>
using namespace std;

// Главная функция
int main()

  // Переменная
  int i = 200;
  // Указатель
  int *ptr;
  // Ссылка
  int &lnk = i;
  // Помещаем в указатель адрес переменной i
  ptr = &i;

  // Обращение по ссылке
  cout << "lnk = " << lnk << endl;
  // Обращение к значению i через указатель
  cout << "*ptr = " << *ptr << endl;
  // Адрес, который хранится в указателе
  cout << "ptr = " << ptr << endl;

  // Пауза перед закрытием
  system("PAUSE");
  return 0;
}

  Ответить  
 
 автор: asker++   (19.11.2011 в 03:08)   письмо автору
 
   для: cheops   (18.11.2011 в 20:39)
 

Спасибо, но все-равно пока не очень понятно. Ничего если я еще поспрашиваю?

  Ответить  
 
 автор: cheops   (19.11.2011 в 03:34)   письмо автору
 
   для: asker++   (19.11.2011 в 03:08)
 

Вопросы только приветствуются (только под новые вопросы, желательно заводить новые темы).

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования