Указатели, ссылки

Модераторы: Hawk, Romeo, Absurd, DeeJayC, WinMain

Ответить
Лена89
Сообщения: 51
Зарегистрирован: 20 июн 2007, 10:36

05 дек 2007, 15:24

Здравствуйте!

Не до конца понимаю смысл указателей и ссылок (в C++). Вернее, когда читаю литературу понятно. А на практике не «улавливаю», как и когда их лучше применить. Может быть, посоветуете какую-нибудь литературу, которая помогла бы в этом вопросе … или что-нибудь посоветуете.
Извините, за возможно, глупый вопрос. :confused:

Всего наилучшего!
BBB
Сообщения: 1272
Зарегистрирован: 27 дек 2005, 13:37

05 дек 2007, 15:58

Скорее, тут надо образное мышление применить :)
Если образно, то отдельная переменная - это некий "ящичек", хранилище, где лежит некоторое значение. Причем содержимое "ящичка" можно менять, кладя туда новое значение.
Все "ящички"-переменные стоят рядом друг с другом и пронумерованы (т.е. у каждой переменной есть свой адрес).
А указатель - это "бумажка", на которой записан "номер" какого-либо "ящичка" (адрес переменной). Причем, этот адрес можно с бумажки стирать и писать какой-то другой (т.е. переменной-указателю также можно присваивать разные значения).

А вот то, что с C++ указатель и массив "приравнены в правах", для меня в самом деле тяжело воспринималось. Казалось бы, разве целая "стопка ящичков" и бумажка с номером "первого по порядку" (т.е. нулевого) ящичка - это одно и то же?
Albor
Сообщения: 482
Зарегистрирован: 06 сен 2004, 13:34
Откуда: Днепропетровск

05 дек 2007, 17:21

Дополню немного пост от ВВВ. Ссылка - псевдоним какой-либо переменной. Особая ценность ссылки - передача параметров в функцию. Если данные передаются по ссылке, то функция работает с оригиналом переменной, а не с копией. Чем хорошо? Вдруг результатом работы функции должно быть несколько значений, причём разных типов, одно значение можно вернуть оператором return, а остальные - передать по ссылке в качестве параметров. Как и когда применять, то лучше подумать на примерах. Например, написать функцию, обрабатывающую массив данных. Как передать данные в функцию? Если передать по значению, то в функции будет создана копия массива, а если массив очень большой? Но это первая половина беды, а вторая - возврат обработанного массива - опять копирование. Поэтому в функцию лучше передать указатель на начало массива и его размер. Уже не будет потерь времени на копирование. Когда дойдёшь до изучения классов и наследования, то оценишь удобство указателя на базовый класс. Например, класс описывающий транспортное средство будет базовым для класса МОТОЦИКЛ, ЛЕГКОВУШКА, ГРУЗОВИК и т.д. Объявив указатель на ТРАНСПОРТНОЕ СРЕДСТВО, можно присвоить ему значение любого из наследников и обработать в одном цикле, например, и мотоциклы и автобусы и т.д. Вобщем, по мере накопления опыта, всё это станет более очевидным. Главное сейчас не пытаться "схватить" сразу всё - голова может опухнуть. Успехов.
o4en1 krutoi
Сообщения: 9
Зарегистрирован: 24 ноя 2007, 11:10

06 дек 2007, 14:51

#include <iostream>
#include <windows.h>
using namespace std;
void main()
{
SetConsoleCP(1251);
SetConsoleOutputCP(1251);
char str[] = "Здравствуй, мир!"; // объявляем символьный массив
char *b; // объявляем указатель на символ
b = &str[12]; // теперь b указывает на 12-ый символ str //символ это пробел
*b = 'M'; // присваиваем первому элементу b символ 'М'
cout << b; // выводим строку b на экран (Мир!) //присвоили указателю b
символ 'M' а выходит слово мир почему не 'M' подскажите хто знает
}
Ответить