Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.62/13: Рейтинг темы: голосов - 13, средняя оценка - 4.62
БТР - мой друг
 Аватар для Hagrael
333 / 277 / 47
Регистрация: 07.01.2010
Сообщений: 1,932

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

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

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

Заранее благодарен
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
13.01.2011, 15:41
Ответы с готовыми решениями:

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

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

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

14
Модератор
Эксперт PythonЭксперт JavaЭксперт CЭксперт С++
 Аватар для easybudda
12843 / 7592 / 1766
Регистрация: 25.07.2009
Сообщений: 13,973
13.01.2011, 15:45
Цитата Сообщение от Hagrael Посмотреть сообщение
Декларировать так как выяснилось нельзя:
ну, раз переменная-указатель содержит адрес, значит ей адрес и надо присваивать, а не значение
C
1
2
3
int a = 13;
int *pa = &a;
printf("%d = %d", a, *pa);
1
БТР - мой друг
 Аватар для Hagrael
333 / 277 / 47
Регистрация: 07.01.2010
Сообщений: 1,932
13.01.2011, 15:48  [ТС]
easybudda, то есть ссылочная переменная обозначает адрес, а не использует тот же? о_О
0
Эксперт С++
5058 / 3118 / 271
Регистрация: 11.11.2009
Сообщений: 7,044
13.01.2011, 15:50
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
333 / 277 / 47
Регистрация: 07.01.2010
Сообщений: 1,932
13.01.2011, 16:01  [ТС]
Большое спасибо, очень многое прояснилось
То есть при записи &number (не при декларировании переменной) мы получаем её адрес, круть Но почему нельзя написать так:
C++
1
int *pointer="0xff54";
?

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

Добавлено через 1 минуту
Цитата Сообщение от Hagrael Посмотреть сообщение
И зачем надо указывать тип указателя
про адресную арифметику почитайте
0
Эксперт С++
 Аватар для Mr.X
3225 / 1752 / 436
Регистрация: 03.05.2010
Сообщений: 3,867
13.01.2011, 16:23
Цитата Сообщение от silent_1991 Посмотреть сообщение
ссылка... Под неё не выделяется память.
А вы это прочитали где-то или сами придумали?
1
Эксперт С++
5058 / 3118 / 271
Регистрация: 11.11.2009
Сообщений: 7,044
13.01.2011, 17:16
Mr.X, да, прошу прощения, пришлось открыть Страуструпа и перечитать про ссылки, там сказано, что "в некоторых случаях компилятор может оптимизировать код так, что вообще не будет существовать объекта, представляющего ссылку".
0
Модератор
Эксперт PythonЭксперт JavaЭксперт CЭксперт С++
 Аватар для easybudda
12843 / 7592 / 1766
Регистрация: 25.07.2009
Сообщений: 13,973
13.01.2011, 17:24
Цитата Сообщение от Mr.X Посмотреть сообщение
А вы это прочитали где-то или сами придумали?
Честно говоря, не помню, почему, но я ссылки в С++ примерно так же воспринимал. На счёт выделения под них памяти ничего не скажу, но что по сути ссылка является псевдонимом существующего в памяти объекта, до сих пор не сомневался... А как оно на самом деле?
0
Эксперт С++
5058 / 3118 / 271
Регистрация: 11.11.2009
Сообщений: 7,044
13.01.2011, 17:28
easybudda, полагаю, ко мне претензии были только в плане выделения памяти)))
0
БТР - мой друг
 Аватар для Hagrael
333 / 277 / 47
Регистрация: 07.01.2010
Сообщений: 1,932
13.01.2011, 17:51  [ТС]
Цитата Сообщение от easybudda Посмотреть сообщение
про адресную арифметику почитайте
Не нашёл ничего толкового про это Когда я пишу такую строчку:
C++
1
cout << typeid(pointer).name() << endl;
Выводится PSs о_О Это ещё что такое?
0
Эксперт С++
5058 / 3118 / 271
Регистрация: 11.11.2009
Сообщений: 7,044
13.01.2011, 18:07
Цитата Сообщение от Hagrael Посмотреть сообщение
И зачем надо указывать тип указателя
Тип нужен для того, чтобы указатель знал, на сколько надо сместиться, чтобы достичь очередного элемента массива (в контексте массивов). Т.е. при использовании указателя типа int смещение будет происходить на 4 байта (при sizeof(int) == 4), а при использовании double уже на 8.
0
Эксперт С++
 Аватар для Mr.X
3225 / 1752 / 436
Регистрация: 03.05.2010
Сообщений: 3,867
13.01.2011, 18:07
Цитата Сообщение от easybudda Посмотреть сообщение
Честно говоря, не помню, почему, но я ссылки в С++ примерно так же воспринимал. На счёт выделения под них памяти ничего не скажу, но что по сути ссылка является псевдонимом существующего в памяти объекта, до сих пор не сомневался... А как оно на самом деле?
Вообще-то Страуструп описывает очевидную реализацию ссылки как константный указатель, при каждом использовании которого происходит разыменование.
Как, например, обойтись без выделения памяти, если ссылка является членом класса или параметром функции.
1
БТР - мой друг
 Аватар для Hagrael
333 / 277 / 47
Регистрация: 07.01.2010
Сообщений: 1,932
13.01.2011, 18:38  [ТС]
Цитата Сообщение от silent_1991 Посмотреть сообщение
Тип нужен для того, чтобы указатель знал, на сколько надо сместиться, чтобы достичь очередного элемента массива (в контексте массивов). Т.е. при использовании указателя типа int смещение будет происходить на 4 байта (при sizeof(int) == 4), а при использовании double уже на 8.
То есть при работе с отдельными переменными это на самом деле не имеет значения?
0
Эксперт С++
5058 / 3118 / 271
Регистрация: 11.11.2009
Сообщений: 7,044
13.01.2011, 19:03
Hagrael, да, по сути указатели всех типов совместимы между собой. Но все же лучше, когда это возможно, использовать указатели соответствующих типов.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
13.01.2011, 19:03
Помогаю со студенческими работами здесь

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

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

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

Структуры, массивы, указатели, динамические массивы структур
Помогите с решением задачи (прикрепляю условие). Заранее спасибо.

Указатели и ссылки
Используя вместо самой переменной указатель на нее написать программу в соответствии с заданием: Вычислить y = cos|x3-x2|.


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

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Новые блоги и статьи
Символьное дифференцирование
igorrr37 13.02.2026
/ * Логарифм записывается как: (x-2)log(x^2+2) - означает логарифм (x^2+2) по основанию (x-2). Унарный минус обозначается как ! */ #include <iostream> #include <stack> #include <cctype>. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru