Консультация № 72655
25.01.2007, 22:04
0.00 руб.
0 5 5
Здравствуйте эксперты!Скажите для чего нужны указатели в C++ ,какую функцию они выполняют?
(я начинающий)

Обсуждение

Неизвестный
25.01.2007, 22:37
общий
это ответ
Здравствуйте, Hunter20!
Указатель в C++ служит для хранения адреса объекта.
Существует также специальная операция взятия адреса, обозначаемая символом &.
Ее результатом является адрес объекта.

Приложение:
Пример:int *pint; //Указатель на объект типа intpint = &ival; // pint получает значение адреса ival
Неизвестный
25.01.2007, 23:10
общий
это ответ
Здравствуйте, Hunter20!

указатели удобны и эффективны при работе с массивами и структурами/классами.
самый очевидный пример это передача в фунцию как параметр:
void f(char *b)
{
*b = 1;
b[1] = 2;
}

char a[100000];
int main()
{
f(a);
return 0;
}

в этом примере при передаче массива внутрь фунции не делается копия всего большого массива, а передается только указатель на его начало. что несомненно быстрее чем создавать копию 100000 элементов Ж:-) (к слову сказать в С++ вам и не удастся передать
массив внуть фунции по значению, но это просто как пример).

более сложный, но уже вполне реальный пример вот:
class A
{
public:
char a[100000];
};

void f1(A *b)
{
*(b->a) = 1;
b->a[1] = 2;
}

void f2(A b)
{
*(b.a) = 1;
b.a[1] = 2;
}

A aa;
int main()
{
f1(&aa);
f2(aa);
return 0;
}

в фунции f1 будет передан только указатель на объект класса.
а фунции f2 будет сделана копия класса и передана внутрь фунции. тоесть будет скопировано как минимум 100000 байт. что скажется и на скорости и на кол-ве оперативной памяти занимаемой программой.

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

хотя указатели это палка о двух концах. если ошибится с адресом в указателе, то программа поведет себя не предсказуемо. в некоторых языках программирования(java, C#...) намеренно отказываются от указателей.
Неизвестный
26.01.2007, 00:04
общий
это ответ
Здравствуйте, Hunter20!

указатель - это адрес ячейки памяти, которая может содержать какое-либо значение.
не все указатели одинаковы. например если указатель указывает(прости за тафтологию) на значение типа int, то это означает что он адресует область памяти размером 4 байта, если на значение типа char - то 1 байт.
указатели могут указывать на значения как встроенных типов данных, так и на значения тип которых определен пользователем(например на объекты классов).
указатели используют для передачи данных в функции. например нам нужно передать в какую-либо функцию массив содержащий миллион элементов. если мы будем передавать по значению, это будет означать что во время выполнения программы в момент передачи будет создан такой же массив, что не есть хорошо, поскольку занимает много памяти. можно поступить проще - передав указатель на первый элемент массива.
так же наличие указателей позволяет реализовать один из принципов объектно-ориентированного программирования - полиморфизм.
вот в кратце и все. а вообще лучше читай страуструпа.
удачи.
Неизвестный
26.01.2007, 02:41
общий
это ответ
Здравствуйте, Hunter20!
Не пытайтесь понять это сходу - это невозможно.
Я около двух месяцев ходил и не понимал для чего они нужны, а потом ... осознание само пришло.

Для программирования на С/С++ понимания указателя одно из главных. С помощью него можно творить такое, что ни на одном другом языке сделать нельзя, и при этом это будет красиво и очень быстро. Во многом так же зависит от креатива программиста, ведь с помощью указателей появляются большое разнообразие в алгоритмах, которые будут не переносимы на другие языки, за исключением разве что ассемблера.

Я честно скажу, я не знаю как обьяснить новичку что такое указатель. Я кстати вначале думал именно так же как и вы, нафига мне этот указатель, а толку от него ?
Почему обычные переменные нельзя вместо него использовать ?

Вот, единственное только что скажу смотрите в сторону динамических структур данных, например, массивов. Динамическое выделение и освобождение памяти.
Неизвестный
26.01.2007, 15:16
общий
это ответ
Здравствуйте, Hunter20!
Указатель это переменная, которая содержит в себе адрес другой переменной. Несколько указателей могут указывать на один объект. Вот пример:
int *a; - объявляем пременную, которая содержит в себе адрес (указывает)некоторой переменной в памяти типа int.
стоит заметить, что после такого объявления a никуда конкретно указывает, т.е. BadPtr, и при попытке ее использовать вылезет ошибка. Если указатель это адрес, то логичен вопрос как получить какой-то адрес. Для этого служит оператор &. Пример: пусть есть переменная b:
int b = 4;
и есть указатель a:
int *a;
теперь присвоим a адресс b:
a = &b;
А теперь об использовании. Что бы обратиться к значению нужно использовать разименование. Деллается это добавлением *. Т.е. a - это адресс, *a - то что по этому адресу находиться.
int b = 4;
int *a = &b;
*a = 3;//Теперь хначение b равно 3.
Можно также выделить одну или несколько ячеек и взять адрес первой выделенной ячейки. Для это есть оператор new (стоит заметить, что он есть только в С++, в С его нету).
int *a = new int[3];//выделяем три ячейки типа int, оператор new возвращает адресс первой из них.
Далее важный момент это адресная арифметика. Пусть а - это указатель, тогда а + 1 это тоже адрес, но следующей ячейки. a++ здесь указатель сдвигается на одно значение. Важный момент: *(a + 2),это тоже самое, что и a[2], т.е. мы можем работать с группой выделенных ячеек как с массивом. После завершения работы с указателем его нужно удалить с помощью delete. Например так: delete a;
Форма ответа