На данный вопрос уже ответили:
Чем отличаются ссылки от указателей в С++
2 ответа
Чем отличается ссылка от указателя?
Почему при условиях
int *p;
int t=100;
выражения
*p=100;
*p=&t;
корректны, а
*p=t
некорректно.
Зачем эти сложности вообще?
И если можно, как всегда примерчик, раскрывающий хотя бы кусочек глубокой (я так понимаю)идеи ссылок и указателей.
P.S.
Уточняю, прочитав все выше, я понял где то так:
struct big{/*some_very_large_struct*/};
struct big baobab;
void doSomething(struct big boom) {
/*do something with boom*/
};
void doSomething1(struct big *boom) {
/*do something with boom*/
};
void doSomething2(struct big& boom) {
/*do something with boom*/
};
int main {
void doSomething(baobab);//эта функция принимает целую копию структуры для работы
void doSomething1(&baobab);//эта функция принимает номер ячейки где искать структуру для работы
void doSomething2(baobab);//эта функция принимает "живую" структуру, но работает с ссылкой на нее
return 0;
};
Ответ
Что-то Вы, видимо, не то читали… Обычно в книжках крайне понятно излагают…
Так, на пальцах:
Вот у Вас есть переменная int a. Это такая буковка, с помощью которой компилятор умеет определить, о чём Вы ему говорите. Он знает, что за буковкой a кроется значение в памяти, расположенное по какому-то адресу (адрес в памяти — это число). Ну, Вы же понимаете, что переменная — это такая штука, чтобы удобно по имени обращаться к данным, записанным в определённом участке памяти.
Так вот, указатель — это, тупо, то самое число, тот самый адрес. Т.е. &a равно именно в точности адресу в памяти, по которому хранится значение. Чтобы избежать невнятных проблем, тип «указатель на int (или на любой другой тип) — int*» — это такой совершенно отдельный тип.
Итак есть два волшебных оператора: * и &. Второй по данной переменной узнаёт её адрес в памяти. Первый по данному адресу (который, как мы помним, хранится в переменной типа int*) возвращает собственно данные, расположенные по этому адресу.
int a = 566;
// Завели переменную. Число 566 записалось в память по какому-то адресу
// &a — адрес, по которому записалось число
int *p;
// Переменная типа «указатель на int»
// На самом деле понятно, что все указатели на все типы — одна малина. Это просто
// 32-битные числа. Но C++ строго типизированный язык, потому нельзя непосредственно
// присвоить char* к int*
// Зато можно присвоить int* к int*
p = &a; // Как мы помним, &a возвращает адрес в памяти
int b = *p;
// Теперь в переменной b лежит ЗНАЧЕНИЕ, которое находится по адресу, на который
// указывает p (а как мы знаем, p указыает туда, где лежит значение a)
b == a;
// Это верно
// На данный момент у нас в переменных a и b лежит одно и то же число.
int *p2 = &b;
// Теперь p указывает на a, а p2 — на b.
// a=566, b=566, *p=566, *p2=566
*p2 = 777;
// По адресу, на который указывает p2, положили число 777. Как мы помним, p2
// указывает туда, где лежит значение b. Значит теперь b = 777.
p = &b;
// Теперь оба указателя указывают на одну и ту же ячейку в памяти.
// Ну и так далее
Про ссылки чуть попозже напишу. Или кто-нибудь другой напишет…
Комментариев нет:
Отправить комментарий