Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.87/46: Рейтинг темы: голосов - 46, средняя оценка - 4.87
 Аватар для gomodril
6 / 6 / 0
Регистрация: 10.10.2012
Сообщений: 140

Расскажите популярно про ссылки и указатели

04.01.2013, 16:05. Показов 12232. Ответов 110
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Помогите разобраться со ссылками и указателями на различные объекты. Запутался вообще в них полностью. Когда читаю книгу про них, то вроде все понятно написано, но примеров для меня видимо не достаточно, что бы как то их различать. В итоге начинаю решать задачи и ни чего не выходит.
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
04.01.2013, 16:05
Ответы с готовыми решениями:

Популярно объясните про указатели
Что-то плохо даётся мне тема про указатели. Я хорошо уяснил, что вот так создаётся указатель: int *pointer; Я так же хорошо...

Пояснить про указатели и ссылки
есть переменное и указатель.. Значение нашей переменной случайный адрес, Как менять адрес указателя, таким образом, что бы она стала...

Что нужно знать про указатели и ссылки?
Привет, завтра кр по теме указатели и ссылки в с++, пишите сюда что необходимо знать.

110
 Аватар для taras atavin
4226 / 1799 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
05.01.2013, 13:59
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от Nixy Посмотреть сообщение
если внимательно подебажить то в si_1 записывается, 4 символа, которые si_2 переводятся в число, число же потом переводится в 16 ричную систему и выводится на экран, это не адрес как вам кажется а представление того мустора коим заполнена переменная
C++
1
cout<<si_2;
выводит именно значение указателя, то есть адрес.
1
ComfyMobile
 Аватар для Nixy
401 / 282 / 34
Регистрация: 24.07.2012
Сообщений: 916
05.01.2013, 14:01
taras atavin, хотя да, ты прав ,это адрес, меня смутило что он очень похож у меня на содержимое
0
 Аватар для Kastaneda
5232 / 3206 / 362
Регистрация: 12.12.2009
Сообщений: 8,143
Записей в блоге: 2
05.01.2013, 14:01
Цитата Сообщение от Nixy Посмотреть сообщение
так выведет содержимое адреса в первом случае это Н а во втором, int число всего муссора
Собственно, что и пытаемся объяснить ТС'у - в первом случае в стек положится/извлечется 1 байт, а во втором 4.
0
 Аватар для gomodril
6 / 6 / 0
Регистрация: 10.10.2012
Сообщений: 140
05.01.2013, 14:10  [ТС]
Всем большое спасибо Теперь про указатели на char буду иметь всегда во внимании.
А на массив ссылку я правильно сделал?
C++
1
2
3
4
int mas_1[10] = {12,22,33}; //массив из 10 целых
int* mas_2 = &mas_1[0]; //ссылка на массив из 10 целых
 
std::cout << "Ссылка на массив = " << mas_2 << endl;
Вообще про ссылки на массивы я не совсем понял, в книге написано только про указатели на массивы и то что я в примере привел, это будет указателем на массив. А про ссылки на массивы там ни чего не написано. Но может это и есть тогда ссылка на него или нужно просто в выводе написать &mas_1 ?
0
 Аватар для Toshkarik
1181 / 894 / 94
Регистрация: 03.08.2011
Сообщений: 2,461
05.01.2013, 14:16
gomodril, имя статического массива почти тоже самое, что и константный указатель. Как отдельной переменной, этого указателя не существует в программе, нельзя взять его адрес. Но можно использовать для присваивания другим указателям.

Добавлено через 1 минуту
В Вашем примере Вы берете не адрес массива, а адрес его первого элемента. Можно было бы просто написать
C++
1
int *mas_2 = mas_1;
0
 Аватар для gomodril
6 / 6 / 0
Регистрация: 10.10.2012
Сообщений: 140
05.01.2013, 14:21  [ТС]
Цитата Сообщение от Toshkarik Посмотреть сообщение
gomodril, имя статического массива почти тоже самое, что и константный указатель. Как отдельной переменной, этого указателя не существует в программе, нельзя взять его адрес. Но можно использовать для присваивания другим указателям.

Добавлено через 1 минуту
В Вашем примере Вы берете не адрес массива, а адрес его первого элемента. Можно было бы просто написать
C++
1
int *mas_2 = mas_1;
Задание которое я делал в данном примере. Напишите следующие объявления - массив из 10 целых, ссылка на массив 10 целых. Проинициализируйте все объекты и организуйте вывод на консоль.
Вот я теперь и ломаю голову - правильно я сделал или нет. Т.к. хочу усвоить хорошо тему со ссылками и указателями.
0
 Аватар для taras atavin
4226 / 1799 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
05.01.2013, 14:23
Цитата Сообщение от gomodril Посмотреть сообщение
А на массив ссылку я правильно сделал?
int mas_1[10] = {12,22,33}; //массив из 10 целых
int* mas_2 = &mas_1[0]; //ссылка на массив из 10 целых
Это указатель на массив.
0
 Аватар для gomodril
6 / 6 / 0
Регистрация: 10.10.2012
Сообщений: 140
05.01.2013, 14:24  [ТС]
Цитата Сообщение от Toshkarik Посмотреть сообщение
gomodril, имя статического массива почти тоже самое, что и константный указатель. Как отдельной переменной, этого указателя не существует в программе, нельзя взять его адрес. Но можно использовать для присваивания другим указателям.

Добавлено через 1 минуту
В Вашем примере Вы берете не адрес массива, а адрес его первого элемента. Можно было бы просто написать
C++
1
int *mas_2 = mas_1;
Все правильно, можно было и так написать и было бы это - указатель на начальный элемент (неявное преобразование), но вопрос тут меня мучает следующий - просили ссылку на массив, а я написал указатель, правильно я сделал или нет? И как будет правильно.
0
 Аватар для taras atavin
4226 / 1799 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
05.01.2013, 14:31
Цитата Сообщение от Toshkarik Посмотреть сообщение
В Вашем примере Вы берете не адрес массива, а адрес его первого элемента.
Не первого, а нулевого и это одновременно адрес всего массива.

Добавлено через 1 минуту
Цитата Сообщение от gomodril Посмотреть сообщение
Все правильно, можно было и так написать и было бы это - указатель на начальный элемент (неявное преобразование), но вопрос тут меня мучает следующий - просили ссылку на массив, а я написал указатель, правильно я сделал или нет? И как будет правильно.
Даже не представляю себе синтаксис именно ссылки на целый массив.
0
 Аватар для Toshkarik
1181 / 894 / 94
Регистрация: 03.08.2011
Сообщений: 2,461
05.01.2013, 14:35
taras atavin, первого элемента, а не нулевого. Первый элемент с нулевым индексом. Это разные вещи. Счет идет с единицы, индексация в C++ идет с 0.

gomodril, никаких неявных преобразований, эти записи идентичны. По сути любой массив это последовательность байт, и можно лишь взять адрес начала этой последовательности. Нельзя сделать ссылку на массив. Думаю, задание немного некорректно, и Вы сделали именно то, чего от Вас хотели.
0
 Аватар для gomodril
6 / 6 / 0
Регистрация: 10.10.2012
Сообщений: 140
05.01.2013, 14:38  [ТС]
Цитата Сообщение от taras atavin Посмотреть сообщение
Не первого, а нулевого и это одновременно адрес всего массива.

Добавлено через 1 минуту
Даже не представляю себе синтаксис именно ссылки на целый массив.
А если это сделать следующим образом:

C++
1
2
3
int mas_1[10] = {12,22,33};     //массив из 10 целых
int& mas_2 = mas_1[0];          //ссылка на массив из 10 целых
std::cout << "Ссылка на массив = " << mas_2 << endl;
Вроде логически правильно ...

Добавлено через 1 минуту
Цитата Сообщение от Toshkarik Посмотреть сообщение
taras atavin, первого элемента, а не нулевого. Первый элемент с нулевым индексом. Это разные вещи. Счет идет с единицы, индексация в C++ идет с 0.

gomodril, никаких неявных преобразований, эти записи идентичны. По сути любой массив это последовательность байт, и можно лишь взять адрес начала этой последовательности. Нельзя сделать ссылку на массив. Думаю, задание немного некорректно, и Вы сделали именно то, чего от Вас хотели.
Это задание из книги Язык программирования С++ Специальное издание БИНОМ Издание 2010
0
 Аватар для Toshkarik
1181 / 894 / 94
Регистрация: 03.08.2011
Сообщений: 2,461
05.01.2013, 14:39
gomodril, это будет ссылка на первый элемент массива, а не на сам массив.
1
 Аватар для gomodril
6 / 6 / 0
Регистрация: 10.10.2012
Сообщений: 140
05.01.2013, 16:35  [ТС]
В общем сделал я так:

C++
1
2
3
4
int mas_1[10] = {12,22,33};     //массив из 10 целых
int& mas_2 = mas_1[0];          //ссылка на массив из 10 целых
int* mas_3 = mas_1;         //указатель на массив
std::cout << "Ссылка на массив = " << mas_2 << '\t' << "Указатель на массив = " << mas_3 << endl;
Ведь задания выполняю для себя самого Теперь буду дальше учить...

Добавлено через 1 час 50 минут
По заданию нужно написать указатель на массив строк.

C++
1
2
3
4
char *m_str_1[] = {"Kisa1",     //указатель на массив строк
        "Kisa2",
        "Kisa3"};
std::cout << "Указатель на символьный массив 'm_str_1' = " << m_str_1 << endl;
Правильно ли я выполнил задание?
0
 Аватар для Toshkarik
1181 / 894 / 94
Регистрация: 03.08.2011
Сообщений: 2,461
05.01.2013, 16:42
Это не указатель на массив строк. А массив указателей на строковые литералы. А строковые литералы являются константами. Поэтому верная запись будет выглядеть вот так:
C++
1
2
3
const char *m_str_1[] = {"Kisa1",
                         "Kisa2",
                         "Kisa3"}
0
 Аватар для taras atavin
4226 / 1799 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
05.01.2013, 16:42
Цитата Сообщение от gomodril Посмотреть сообщение
А если это сделать следующим образом:
C++
1
2
3
int mas_1[10] = {12,22,33}; * * //массив из 10 целых
int& mas_2 = mas_1[0];* * * * * //ссылка на массив из 10 целых
std::cout << "Ссылка на массив = " << mas_2 << endl;
Ссылка есть синоним, а нулевой элемент только находится по адресу всего массива, но всему массиву не синонимичен. Значение указателя - адрес, а адреса совпадают, поэтому
C++
1
2
int mas_1[10] = {12,22,33}; * * //массив из 10 целых
int *p = &mas_1[0];
присваивает указателю адрес массива и получается указатель на массив. Но синоним всего массива и синоним его элемента не синонимичны друг другу, а ссылка - это синоним самой сущности.
0
05.01.2013, 16:44

Не по теме:

Цитата Сообщение от taras atavin Посмотреть сообщение
а ссылка - это синоним самой сущности.
Смотря с какой стороны посмотреть.

0
 Аватар для taras atavin
4226 / 1799 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
05.01.2013, 16:51
Цитата Сообщение от Toshkarik Посмотреть сообщение
taras atavin, первого элемента, а не нулевого. Первый элемент с нулевым индексом. Это разные вещи. Счет идет с единицы, индексация в C++ идет с 0.
Например, по-английски, first floor (первый этаж) - это тот, который сразу над ground floor, но ground floor - нифига не подвальный этаж, а самый нижний этаж над уровнем грунта. Так что порядковые номера не очень то определены, у англичан 0 - вполне натуральное число. А индексы однозначны.

Добавлено через 2 минуты
Цитата Сообщение от Croessmah Посмотреть сообщение
Смотря с какой стороны посмотреть.
Согласно языку.
0
 Аватар для Toshkarik
1181 / 894 / 94
Регистрация: 03.08.2011
Сообщений: 2,461
05.01.2013, 16:57
Причем тут этажи на английском? Люди ведут счет с единицы. 1 апельсин, 2 апельсина и так далее. А в C++ индексация идет с 0. Просто, видать, посчитали, что так логичнее, так как для первого элемента не нужно делать никаких смещений. Для второго уже нужно сделать смещение на 1 элемент и тд. В любой нормальной книге объясняется, что первый элемент имеет индекс 0.
0
 Аватар для Kastaneda
5232 / 3206 / 362
Регистрация: 12.12.2009
Сообщений: 8,143
Записей в блоге: 2
05.01.2013, 16:57
Цитата Сообщение от Toshkarik Посмотреть сообщение
Нельзя сделать ссылку на массив
Но можно сделать ссылку на указатель на массив.
0
 Аватар для taras atavin
4226 / 1799 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
05.01.2013, 17:03
Цитата Сообщение от Toshkarik Посмотреть сообщение
Причем тут этажи на английском? Люди ведут счет с единицы.
А англичане уже не люди? 0 может быть натуральным числом.

Добавлено через 4 минуты
Цитата Сообщение от Kastaneda Посмотреть сообщение
о можно сделать ссылку на указатель на массив.
Но указатель - не сам массив.
C++
1
2
3
4
char c[]="0123456789ABCDEF";
char *p=c;
std:cout<<sizeof(c)<std::endl; //вернёт 17
std:cout<<sizeof(c)<std::endl; //вернёт 4, или 8
. Ссылка на массив должна и sizeof иметь, как у массива, так что то, что указатель от массива отличает только sizeof - не аргумент, это вся равно уже не синонимы.

Добавлено через 1 минуту
Цитата Сообщение от Toshkarik Посмотреть сообщение
1 апельсин, 2 апельсина и так далее.
Не путай номер с количеством, апельсин может быть пятнадцатым из миллиарда.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
05.01.2013, 17:03

Подскажите хорошую статью про указатели и ссылки
Посоветуйте статью, видео или книгу по указателям и ссылкам в C++, где все доходчиво разъяснено с реальными примерами. Уже много чего...

Расскажите про new и delete в C++
Есть несколько вопросов: 1) Можно ли перегрузить несколько операторов new в разных пространствах имен, а потом просто писать int *t =...

Расскажите пожалуйста про флаги
Доброго времени суток. Помогите пожалуйста разобраться с фалагми. Вот код: #include &lt;iostream&gt; #define ID_F 1001 #define ID_D...

Расскажите на пальцах про классы
Доброе время суток! (сразу оговорюсь, можете кинуть ссылкой куда мне пойти почитать) Сижу разбираюсь в классах и собственно вопросы:...

Расскажите про IDE Intel Parallel Studio XE 2015
Реклама на сайте Intel Parallel Studio XE 2015 написано хорошо, а тех кто пользовался стоит ли установить себе? Добавлено через...


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

Или воспользуйтесь поиском по форуму:
60
Ответ Создать тему
Новые блоги и статьи
Baragoz - DPS/HPS бот для WoW 3.3.5a, многоязычный
AmbA 26.10.2026
Хотите ещё ботов? У меня есть один! А я пока отдохну от него. https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=12062&stc=1&d=1793007952 Инструкция внутри. Сразу отвечу: А в PvP с ним. . .
Особенности gif сгенерированных в Си
russiannick 21.10.2026
Рассмотрим генерацию gif файлов, которые в Си имеют свои особенности. Gif представляет собой графический формат популярный в интернете. Посмотрим на палитру. Gif файл сгенерированный в си отличается. . .
FPS контроллер с анимированными Y-Bot и 3D-звуком miniaudio (Box3D, Recast, BehaviorTree.CPP, ozz-animation, ImGui, OpenGL и SDL3)
8Observer8 18.10.2026
Содержание блога | English Version Полное мультиплатформенное руководство по стартовому проекту с FPS-контроллером игрока, анимированными роботами Y-Bot с 4-слойным блендингом, 3D-физикой Box3D,. . .
Локальный http сервер
Argus19 17.10.2026
Локальный http сервер На работе, на двух локальных компьютерах круглосуточно работают программы опроса приборов с записью в книги Excel,которые раз в сутки записываются на сервер компании. Т. к. . . .
Копировать Windows на новый диск на UEFI
damix 17.10.2026
https:/ / uriesk. wordpress. com/ 2016/ 11/ 01/ move-window-10-to-ssd-on-a-uefi-dualboot-system-with-basic-linux-tools/ TL DR Вставляем диск, а старый подключаем через переходник, грузимся с лайва. . .
ИИ не может найти нужный язык в списке
Supersumestria 05.10.2026
Я ему даю вот такое изображение и прошу найти и подчеркнуть немецкий язык. Возвращает он вот это: https:/ / i. **********/ vqBWLe2. png Нужную строчку в 3й колонке просто выдумал. . Это. . .
Новая последняя моя музыка в SUNO
zorxor 05.10.2026
Здравствуйте, дорогие мои друзья! С большой радостью я хотел бы представить вам свою новую последнею музыку, которую сгенерировала мне по моей просьбе нейросеть SUNO. С уважением, zorxor. Это. . .
Программный домашний кинотеатр
russiannick 27.09.2026
Сподобился на программный домашний кинотеатр. В качестве ЯВУ по традиции выбрал js. В помощники взял Яндекс-Алису. Было создано три зала на разные интересы. исторические и ретро сериал Хичкок. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru