Форум программистов, компьютерный форум CyberForum.ru

Ссылки, указатели и массивы - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 10, средняя оценка - 4.60
Hagrael
БТР - мой друг
 Аватар для Hagrael
331 / 273 / 2
Регистрация: 07.01.2010
Сообщений: 1,932
13.01.2011, 15:41     Ссылки, указатели и массивы #1
Что-то не лезут в голову указатели и ссылки. Вот как я всё понимаю:
Ссылки.
Ссылочные переменные ссылаются на адрес уже существующих переменных, и изменяя их, вы изменяете саму переменную.
Декларировать можно так:
int number=5;
int &ref=number;
Если перед переменной стоит &, то ref не создаётся и принимает значение переменной, а получает тот же адрес, что и переменная (ну а следственно уже значение).
Указатели.
Указатель - это переменная, которая содержит непосредственно адрес переменной (а не располагается по тому же адресу, как ссылка). Декларировать так как выяснилось нельзя:
C++
1
2
int number=25;
int *pointer=number;
А почему? Насчёт массивов тоже непонятки, но пока мне бы хотя бы с этим разобраться.

Заранее благодарен
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
13.01.2011, 15:41     Ссылки, указатели и массивы
Посмотрите здесь:

Указатели и ссылки C++
C++ Указатели и ссылки
C++ C++ | Правильно ли я сделал задание | Массивы | Указатели и Ссылки
C++ [C++]Ссылки и указатели?
Указатели и Ссылки C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
easybudda
Модератор
Эксперт С++
 Аватар для easybudda
9373 / 5423 / 914
Регистрация: 25.07.2009
Сообщений: 10,423
13.01.2011, 15:45     Ссылки, указатели и массивы #2
Цитата Сообщение от Hagrael Посмотреть сообщение
Декларировать так как выяснилось нельзя:
ну, раз переменная-указатель содержит адрес, значит ей адрес и надо присваивать, а не значение
C
1
2
3
int a = 13;
int *pa = &a;
printf("%d = %d", a, *pa);
Hagrael
БТР - мой друг
 Аватар для Hagrael
331 / 273 / 2
Регистрация: 07.01.2010
Сообщений: 1,932
13.01.2011, 15:48  [ТС]     Ссылки, указатели и массивы #3
easybudda, то есть ссылочная переменная обозначает адрес, а не использует тот же? о_О
silent_1991
Эксперт C++
4938 / 3014 / 149
Регистрация: 11.11.2009
Сообщений: 7,024
Завершенные тесты: 1
13.01.2011, 15:50     Ссылки, указатели и массивы #4
Hagrael, вообще говоря, ссылка - это альтернативное имя объекта. Под неё не выделяется память. Т.е. когда компилятор видит запись int &ref = number;, он запоминает, что к определённому адресу память, связанному с number, можно обращаться также, используя идентификатор ref.
Указатель - это переменная, под которую выделяется память, и которая может хранить адрес другого объекта. При этом указатель надо инициализировать так:
C++
1
int *ptr = &number;
В данном контексте оператор & - операция взятия адреса объекта. Т.е. указатель ptr инициализируется не значением переменной (как пытались сделать вы), а её адресом. При этом, чтобы обратиться к самой переменной через указатель, нужно пользоваться операцией *, т.е.
C++
1
*ptr = 5;
эквивалентно
C++
1
number = 5;
Со ссылкой такого делать не надо, поскольку ссылка - псевдоним другого объекта, можно писать просто
C++
1
ref = 5;
что эквивалентно
C++
1
number = 5;
При этом если мы применим операцию взятия адреса к ссылке, мы получим адрес переменной, на которую она ссылается, а если мы применим эту операцию к указателю, мы получим не адрес переменной, а адрес этого указателя.
Hagrael
БТР - мой друг
 Аватар для Hagrael
331 / 273 / 2
Регистрация: 07.01.2010
Сообщений: 1,932
13.01.2011, 16:01  [ТС]     Ссылки, указатели и массивы #5
Большое спасибо, очень многое прояснилось
То есть при записи &number (не при декларировании переменной) мы получаем её адрес, круть Но почему нельзя написать так:
C++
1
int *pointer="0xff54";
?

И зачем надо указывать тип указателя, ведь память под него не зависит от типа, всё равно будет строка, состоящая из определённого кол-ва символов?
easybudda
Модератор
Эксперт С++
 Аватар для easybudda
9373 / 5423 / 914
Регистрация: 25.07.2009
Сообщений: 10,423
13.01.2011, 16:17     Ссылки, указатели и массивы #6
Цитата Сообщение от Hagrael Посмотреть сообщение
Но почему нельзя написать так
кавычки уберите, и пишите, сколько угодно
C
1
int * p = 0x3ff4;
только зачем это? Пальцем в небо попадёте...

Добавлено через 1 минуту
Цитата Сообщение от Hagrael Посмотреть сообщение
И зачем надо указывать тип указателя
про адресную арифметику почитайте
Mr.X
Эксперт С++
 Аватар для Mr.X
2807 / 1583 / 248
Регистрация: 03.05.2010
Сообщений: 3,693
13.01.2011, 16:23     Ссылки, указатели и массивы #7
Цитата Сообщение от silent_1991 Посмотреть сообщение
ссылка... Под неё не выделяется память.
А вы это прочитали где-то или сами придумали?
silent_1991
Эксперт C++
4938 / 3014 / 149
Регистрация: 11.11.2009
Сообщений: 7,024
Завершенные тесты: 1
13.01.2011, 17:16     Ссылки, указатели и массивы #8
Mr.X, да, прошу прощения, пришлось открыть Страуструпа и перечитать про ссылки, там сказано, что "в некоторых случаях компилятор может оптимизировать код так, что вообще не будет существовать объекта, представляющего ссылку".
easybudda
Модератор
Эксперт С++
 Аватар для easybudda
9373 / 5423 / 914
Регистрация: 25.07.2009
Сообщений: 10,423
13.01.2011, 17:24     Ссылки, указатели и массивы #9
Цитата Сообщение от Mr.X Посмотреть сообщение
А вы это прочитали где-то или сами придумали?
Честно говоря, не помню, почему, но я ссылки в С++ примерно так же воспринимал. На счёт выделения под них памяти ничего не скажу, но что по сути ссылка является псевдонимом существующего в памяти объекта, до сих пор не сомневался... А как оно на самом деле?
silent_1991
Эксперт C++
4938 / 3014 / 149
Регистрация: 11.11.2009
Сообщений: 7,024
Завершенные тесты: 1
13.01.2011, 17:28     Ссылки, указатели и массивы #10
easybudda, полагаю, ко мне претензии были только в плане выделения памяти)))
Hagrael
БТР - мой друг
 Аватар для Hagrael
331 / 273 / 2
Регистрация: 07.01.2010
Сообщений: 1,932
13.01.2011, 17:51  [ТС]     Ссылки, указатели и массивы #11
Цитата Сообщение от easybudda Посмотреть сообщение
про адресную арифметику почитайте
Не нашёл ничего толкового про это Когда я пишу такую строчку:
C++
1
cout << typeid(pointer).name() << endl;
Выводится PSs о_О Это ещё что такое?
silent_1991
Эксперт C++
4938 / 3014 / 149
Регистрация: 11.11.2009
Сообщений: 7,024
Завершенные тесты: 1
13.01.2011, 18:07     Ссылки, указатели и массивы #12
Цитата Сообщение от Hagrael Посмотреть сообщение
И зачем надо указывать тип указателя
Тип нужен для того, чтобы указатель знал, на сколько надо сместиться, чтобы достичь очередного элемента массива (в контексте массивов). Т.е. при использовании указателя типа int смещение будет происходить на 4 байта (при sizeof(int) == 4), а при использовании double уже на 8.
Mr.X
Эксперт С++
 Аватар для Mr.X
2807 / 1583 / 248
Регистрация: 03.05.2010
Сообщений: 3,693
13.01.2011, 18:07     Ссылки, указатели и массивы #13
Цитата Сообщение от easybudda Посмотреть сообщение
Честно говоря, не помню, почему, но я ссылки в С++ примерно так же воспринимал. На счёт выделения под них памяти ничего не скажу, но что по сути ссылка является псевдонимом существующего в памяти объекта, до сих пор не сомневался... А как оно на самом деле?
Вообще-то Страуструп описывает очевидную реализацию ссылки как константный указатель, при каждом использовании которого происходит разыменование.
Как, например, обойтись без выделения памяти, если ссылка является членом класса или параметром функции.
Hagrael
БТР - мой друг
 Аватар для Hagrael
331 / 273 / 2
Регистрация: 07.01.2010
Сообщений: 1,932
13.01.2011, 18:38  [ТС]     Ссылки, указатели и массивы #14
Цитата Сообщение от silent_1991 Посмотреть сообщение
Тип нужен для того, чтобы указатель знал, на сколько надо сместиться, чтобы достичь очередного элемента массива (в контексте массивов). Т.е. при использовании указателя типа int смещение будет происходить на 4 байта (при sizeof(int) == 4), а при использовании double уже на 8.
То есть при работе с отдельными переменными это на самом деле не имеет значения?
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
13.01.2011, 19:03     Ссылки, указатели и массивы
Еще ссылки по теме:

Ссылки и указатели C++
C++ Ссылки и указатели
Ссылки и указатели C++

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
silent_1991
Эксперт C++
4938 / 3014 / 149
Регистрация: 11.11.2009
Сообщений: 7,024
Завершенные тесты: 1
13.01.2011, 19:03     Ссылки, указатели и массивы #15
Hagrael, да, по сути указатели всех типов совместимы между собой. Но все же лучше, когда это возможно, использовать указатели соответствующих типов.
Yandex
Объявления
13.01.2011, 19:03     Ссылки, указатели и массивы
Ответ Создать тему
Опции темы

Текущее время: 06:22. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru