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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 10, средняя оценка - 4.60
Hagrael
БТР - мой друг
331 / 273 / 2
Регистрация: 07.01.2010
Сообщений: 1,932
#1

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

13.01.2011, 15:41. Просмотров 1226. Ответов 14
Метки нет (Все метки)

Что-то не лезут в голову указатели и ссылки. Вот как я всё понимаю:
Ссылки.
Ссылочные переменные ссылаются на адрес уже существующих переменных, и изменяя их, вы изменяете саму переменную.
Декларировать можно так:
int number=5;
int &ref=number;
Если перед переменной стоит &, то ref не создаётся и принимает значение переменной, а получает тот же адрес, что и переменная (ну а следственно уже значение).
Указатели.
Указатель - это переменная, которая содержит непосредственно адрес переменной (а не располагается по тому же адресу, как ссылка). Декларировать так как выяснилось нельзя:
C++
1
2
int number=25;
int *pointer=number;
А почему? Насчёт массивов тоже непонятки, но пока мне бы хотя бы с этим разобраться.

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

C++ | Правильно ли я сделал задание | Массивы | Указатели и Ссылки - C++
Вообще прога должна показывать самое большое число по модулю, что она и делает, но меня интересует другой вопрос, правильно ли я...

Нюансы синтаксиса и семантики: ссылки, указатели и массивы в качестве аргументов функций - C++
Перенесено из этой темы. Чтобы вернуть указатели почему вот здесь не надо приводить janr к типу указателя char* на выходе? char*...

Отсортировать массив и вывести на экран (массивы и указатели на указатели) - C++
Даны массивы F-фамилий студентов и S-результаты сессии (5 оценок) , причем s- результат сессии F студента. Отсортировать массив S по...

Указатели и массивы. Указатели и функции - C++
Никак не разберусь с указателями на функцию. Пишу в Visual Studio. Надо написать функцию Compress() с использованием указателей, которая...

Указатели на массивы. Указатели и функции - C++
Вот задача: Даны два массива : А и B. Необходимо создать третий массив, в котором нужно собрать: -Элементы обоих массивов; -Общие...

Указатели и массивы. Индексация с помощью указателей. Передача массивов в функции. Динамические массивы (обработка матриц) - C++
Для каждого элемента , bij, i= 1,...,n , j=1,...,n определяется свой многоугольник местонахождением соответствующего элемента aij (см....

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
easybudda
Модератор
Эксперт CЭксперт С++
9632 / 5580 / 948
Регистрация: 25.07.2009
Сообщений: 10,714
13.01.2011, 15:45 #2
Цитата Сообщение от Hagrael Посмотреть сообщение
Декларировать так как выяснилось нельзя:
ну, раз переменная-указатель содержит адрес, значит ей адрес и надо присваивать, а не значение
C
1
2
3
int a = 13;
int *pa = &a;
printf("%d = %d", a, *pa);
1
Hagrael
БТР - мой друг
331 / 273 / 2
Регистрация: 07.01.2010
Сообщений: 1,932
13.01.2011, 15:48  [ТС] #3
easybudda, то есть ссылочная переменная обозначает адрес, а не использует тот же? о_О
0
silent_1991
Эксперт С++
4964 / 3040 / 149
Регистрация: 11.11.2009
Сообщений: 7,027
Завершенные тесты: 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;
При этом если мы применим операцию взятия адреса к ссылке, мы получим адрес переменной, на которую она ссылается, а если мы применим эту операцию к указателю, мы получим не адрес переменной, а адрес этого указателя.
2
Hagrael
БТР - мой друг
331 / 273 / 2
Регистрация: 07.01.2010
Сообщений: 1,932
13.01.2011, 16:01  [ТС] #5
Большое спасибо, очень многое прояснилось
То есть при записи &number (не при декларировании переменной) мы получаем её адрес, круть Но почему нельзя написать так:
C++
1
int *pointer="0xff54";
?

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

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

Указатели и ссылки c++ - C++
Здравствуйте! Не могли бы вы объяснить как можно использовать ссылки и указатели c++ на практике? Я не пойму для чего они нужны!

Ссылки и указатели - C++
Добрый день, не могу понять чем помогают при использовании указатели и ссылки? Есть код на c++ #progma once class well { ...

Ссылки и указатели - C++
Всем привет. Совсем запутался с ссылками и указателями. Помогите решать задачку: Функция принимает два аргумента, число с плавающей...

Указатели и ссылки - C++
Собственно, не могу до конца осознать как это работает, вот пример из вики(комменты входят в пример) int n = 6; // Объявление...


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
13.01.2011, 19:03
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru