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

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

13.01.2011, 15:41. Показов 2754. Ответов 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
Ответ Создать тему
Новые блоги и статьи
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод Ниже машинный перевод статьи The Thinkpad X220 Tablet is the best budget school laptop period . Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы,. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru