Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Указатели, Помогите разобраться с указателями 
:(
    Опции темы
Fritz
  Дата 20.3.2004, 11:51 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Люди расскажите как пользоваться указателями, для чего нужны...
  Вверх
mr.DUDA
Дата 20.3.2004, 13:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


3D-маньяк
****


Профиль
Группа: Экс. модератор
Сообщений: 8244
Регистрация: 27.7.2003
Где: город-герой Минск

Репутация: 25
Всего: 232



Не нужно дублировать один вопрос в двух темах !!! Теперь - ответ.

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

Для того, чтобы компилятор мог знать тип переменной, адресуемой указателем, указатель имеет тип, например указатель на int, на float, на структуру CString...
Для объявления переменной типа "указатель" используется тот же синтаксис, что и для объявления обычной переменной, только с небольшим отличием в виде звёздочки:
Код
int   *aaa; // указатель "aaa" типа int
float  *bbb; // указатель "bbb" типа float

Чтобы настроить указатель на адрес какой-то переменной, используется операция "&":
Код
int   x; // вот наша переменная
int *px; // объявили указатель
px = &x; // настроили указатель "px" на адрес переменной "x"

Чтобы получить или модифицировать переменную по адресу, хранящемуся в указателе, используется операция звёздочка (но уже по-другому):
Код
int  x = 2;
int  *px = &x; // можно сразу присвоить указателю адрес переменной "x"
int  y = *px; // прочитаем значение по адресу и сохраним его в перем. "у"
*px = 5; // запишем значение по адресу

Указатель может указывать (простите за тавтологию) на переменную любого типа, в том числе - на переменную типа "структура" (или "объект класса"). Для доступа к отдельным полям структуры, адресуемой указателем, используется операция "стрелка":
Код
// описание структуры T
struct T
{
  int     I;
  float  F;
};

T  x; // объявили переменную "x" типа "структура T"
T  *px = &x; // настроили указатель "px" на структуру "x"

px->I = 2; // запишем в поле "I" структуры "x" новое значение
px->F = 3.45; // запишем в поле "F" структуры "x" новое значение
int  s = px->I; // прочитаем значение из поля "I" структуры "x"


Там, где идёт работа с динамически выделяемой памятью, не существует другого способа записи/чтения данных (переменных) в память, кроме указателей. Если например нужно выделить память (с пом. оператора "new") для переменной типа int, а потом записать в неё значение, то действия будут такими:
Код
int  *px = new int; // выделим память
*px = 2; // запишем по адресу
delete  px; // освободим память


Наконец, с массивами в С/С++ можно работать не только с помощью квадратных скобок (т.е. индексов), но и с помощью указателей, так как указатель и массив - это на самом деле синонимы (имя массива является указателем на первый элемент массива), пример:
Код
int  a[10]; // объявили массив
*a = 1; // записали значение в первый элемент


Здесь обязательно нужно сказать о том, что получится, если к указателю прибавить, например, единицу. Дело в том, что в указателе (как было сказано в начале) хранится адрес переменной. И если не ставить перед именем указателя звёздочку, то с помощью арифметических операций можно увеличить или уменьшить значение именно адреса, хранящегося в указателе. То есть, для массива из предыдущего примера, можно прибавить к "a" какое-то число и получить результат - указатель. Перед тем, как будет сказано о практической пользе от изменений адреса, нужно запомнить простое правило: прибавляя к указателю единицу, мы сдвигаем его не на один байт, а на столько байт, сколько занимает в памяти ровно одна переменная, адресуемая указателем! То есть, прибавляя единицу к указателю "a" из примера выше, мы получим указатель на второй элемент массива (элементы массива идут в памяти один за другим, по соседним адресам). Далее, если вычесть один указатель из другого - мы получим разницу не в байтах, а в количестве элементов. Примеры:
Код
int a[10];
int *b = a; // "b" равен указателю на первый элемент массива
b = b + 1; // теперь "b" равен указателю на второй элемент массива

// а вот практический пример - заполним массив числами от 1 до 10
// делаем цикл, указатель "c" пробегает от первого элемента массива "а"
// до последнего: c < (a+10) означает сравнение двух указателей -
// указателя "с" и указателя, сдвинутого от "а" на 10 элементов

for(int *c = a; c < (a+10); c++)
   *c  = (c - a);  // записываем по адресу "с" расстояние от "с" до "а"


Будут вопросы, спрашивай.


--------------------
user posted image
PM MAIL WWW   Вверх
NiJazz
Дата 20.3.2004, 14:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Jazz coder
****


Профиль
Группа: Экс. модератор
Сообщений: 2286
Регистрация: 10.8.2003
Где: Москва

Репутация: 1
Всего: 23



mr.DUDA
Пусть сперва зарегистрируется...

PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0483 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.