|
|
|
| Все-таки есть простое объяснение, что такое указатели, а главное зачем они нужны? | |
|
|
|
|
|
|
|
для: 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 Ну и совсем весело начинается, при работе с указателями на объекты, которые сами по себе довольно сложные конструкции... | |
|
|
|
|
|
|
|
для: cheops
(18.11.2011 в 15:43)
| | Спасибо, получается это типа файловых ссылок в Линуксе? Так вроде в C++ для этого есть ссылки? Указатели и ссылики это одно и тоже? | |
|
|
|
|
|
|
|
для: asker++
(18.11.2011 в 17:52)
| | >Спасибо, получается это типа файловых ссылок в Линуксе?
Да, идея похожая, причем тут речь скорее следует вести о жестких ссылках.
>Так вроде в C++ для этого есть ссылки? Указатели и ссылики это одно и тоже?
Кстати, нет. Ссылки - это отдельный тип данных, они выполняют схожие функции, но для их создания не нужно получать адрес области памяти при помощи & - они делают это автоматически. Плюс они обладают рядом ограничений, которые делают код с использованием более безопасным. Тут вот какая ситуация, сначала в C появились указатели, а потом уже в C++ появился ссылочный тип, однако, указатели не стали убирать, чтобы сохранить обратную совместимость (да и нужны они в системном коде). | |
|
|
|
|
|
|
|
для: cheops
(18.11.2011 в 18:30)
| | А можно пример привести с ссылками и указателями, в чём их различие? | |
|
|
|
|
|
|
|
для: 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;
} |
| |
|
|
|
|
|
|
|
для: cheops
(18.11.2011 в 20:39)
| | Спасибо, но все-равно пока не очень понятно. Ничего если я еще поспрашиваю? | |
|
|
|
|
|
|
|
для: asker++
(19.11.2011 в 03:08)
| | Вопросы только приветствуются (только под новые вопросы, желательно заводить новые темы). | |
|
|
|