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

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

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 32, средняя оценка - 4.84
gomodril
 Аватар для gomodril
6 / 6 / 0
Регистрация: 10.10.2012
Сообщений: 102
04.01.2013, 16:05     Расскажите популярно про ссылки и указатели #1
Помогите разобраться со ссылками и указателями на различные объекты. Запутался вообще в них полностью. Когда читаю книгу про них, то вроде все понятно написано, но примеров для меня видимо не достаточно, что бы как то их различать. В итоге начинаю решать задачи и ни чего не выходит.
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
04.01.2013, 16:05     Расскажите популярно про ссылки и указатели
Посмотрите здесь:

Расскажите про new и delete в C++ C++
C++ Расскажите пожалуйста про флаги
C++ [C++]Ссылки и указатели?
C++ Указатели и ссылки [С++]
Ссылки vs Указатели C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
taras atavin
Ушёл с форума.
 Аватар для taras atavin
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
05.01.2013, 13:59     Расскажите популярно про ссылки и указатели #41
Цитата Сообщение от Nixy Посмотреть сообщение
если внимательно подебажить то в si_1 записывается, 4 символа, которые si_2 переводятся в число, число же потом переводится в 16 ричную систему и выводится на экран, это не адрес как вам кажется а представление того мустора коим заполнена переменная
C++
1
cout<<si_2;
выводит именно значение указателя, то есть адрес.
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Nixy
ComfyMobile
 Аватар для Nixy
399 / 280 / 8
Регистрация: 24.07.2012
Сообщений: 916
05.01.2013, 14:01     Расскажите популярно про ссылки и указатели #42
taras atavin, хотя да, ты прав ,это адрес, меня смутило что он очень похож у меня на содержимое
Kastaneda
Модератор
Эксперт С++
 Аватар для Kastaneda
4236 / 2769 / 218
Регистрация: 12.12.2009
Сообщений: 7,104
Записей в блоге: 1
Завершенные тесты: 1
05.01.2013, 14:01     Расскажите популярно про ссылки и указатели #43
Цитата Сообщение от Nixy Посмотреть сообщение
так выведет содержимое адреса в первом случае это Н а во втором, int число всего муссора
Собственно, что и пытаемся объяснить ТС'у - в первом случае в стек положится/извлечется 1 байт, а во втором 4.
gomodril
 Аватар для gomodril
6 / 6 / 0
Регистрация: 10.10.2012
Сообщений: 102
05.01.2013, 14:10  [ТС]     Расскажите популярно про ссылки и указатели #44
Всем большое спасибо Теперь про указатели на 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 ?
Toshkarik
 Аватар для Toshkarik
1139 / 856 / 50
Регистрация: 03.08.2011
Сообщений: 2,381
Завершенные тесты: 1
05.01.2013, 14:16     Расскажите популярно про ссылки и указатели #45
gomodril, имя статического массива почти тоже самое, что и константный указатель. Как отдельной переменной, этого указателя не существует в программе, нельзя взять его адрес. Но можно использовать для присваивания другим указателям.

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

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

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

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

gomodril, никаких неявных преобразований, эти записи идентичны. По сути любой массив это последовательность байт, и можно лишь взять адрес начала этой последовательности. Нельзя сделать ссылку на массив. Думаю, задание немного некорректно, и Вы сделали именно то, чего от Вас хотели.
gomodril
 Аватар для gomodril
6 / 6 / 0
Регистрация: 10.10.2012
Сообщений: 102
05.01.2013, 14:38  [ТС]     Расскажите популярно про ссылки и указатели #51
Цитата Сообщение от 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
Toshkarik
 Аватар для Toshkarik
1139 / 856 / 50
Регистрация: 03.08.2011
Сообщений: 2,381
Завершенные тесты: 1
05.01.2013, 14:39     Расскажите популярно про ссылки и указатели #52
gomodril, это будет ссылка на первый элемент массива, а не на сам массив.
gomodril
 Аватар для gomodril
6 / 6 / 0
Регистрация: 10.10.2012
Сообщений: 102
05.01.2013, 16:35  [ТС]     Расскажите популярно про ссылки и указатели #53
В общем сделал я так:

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;
Правильно ли я выполнил задание?
Toshkarik
 Аватар для Toshkarik
1139 / 856 / 50
Регистрация: 03.08.2011
Сообщений: 2,381
Завершенные тесты: 1
05.01.2013, 16:42     Расскажите популярно про ссылки и указатели #54
Это не указатель на массив строк. А массив указателей на строковые литералы. А строковые литералы являются константами. Поэтому верная запись будет выглядеть вот так:
C++
1
2
3
const char *m_str_1[] = {"Kisa1",
                         "Kisa2",
                         "Kisa3"}
taras atavin
Ушёл с форума.
 Аватар для taras atavin
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
05.01.2013, 16:42     Расскажите популярно про ссылки и указатели #55
Цитата Сообщение от 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];
присваивает указателю адрес массива и получается указатель на массив. Но синоним всего массива и синоним его элемента не синонимичны друг другу, а ссылка - это синоним самой сущности.
Croessmah
05.01.2013, 16:44
  #56

Не по теме:

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

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

Добавлено через 2 минуты
Цитата Сообщение от Croessmah Посмотреть сообщение
Смотря с какой стороны посмотреть.
Согласно языку.
Toshkarik
 Аватар для Toshkarik
1139 / 856 / 50
Регистрация: 03.08.2011
Сообщений: 2,381
Завершенные тесты: 1
05.01.2013, 16:57     Расскажите популярно про ссылки и указатели #58
Причем тут этажи на английском? Люди ведут счет с единицы. 1 апельсин, 2 апельсина и так далее. А в C++ индексация идет с 0. Просто, видать, посчитали, что так логичнее, так как для первого элемента не нужно делать никаких смещений. Для второго уже нужно сделать смещение на 1 элемент и тд. В любой нормальной книге объясняется, что первый элемент имеет индекс 0.
Kastaneda
Модератор
Эксперт С++
 Аватар для Kastaneda
4236 / 2769 / 218
Регистрация: 12.12.2009
Сообщений: 7,104
Записей в блоге: 1
Завершенные тесты: 1
05.01.2013, 16:57     Расскажите популярно про ссылки и указатели #59
Цитата Сообщение от Toshkarik Посмотреть сообщение
Нельзя сделать ссылку на массив
Но можно сделать ссылку на указатель на массив.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
05.01.2013, 17:03     Расскажите популярно про ссылки и указатели
Еще ссылки по теме:

Популярно объясните про указатели C++
Пояснить про указатели и ссылки C++
Расскажите про IDE Intel Parallel Studio XE 2015 C++

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

Или воспользуйтесь поиском по форуму:
taras atavin
Ушёл с форума.
 Аватар для taras atavin
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
05.01.2013, 17:03     Расскажите популярно про ссылки и указатели #60
Цитата Сообщение от 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 апельсина и так далее.
Не путай номер с количеством, апельсин может быть пятнадцатым из миллиарда.
Yandex
Объявления
05.01.2013, 17:03     Расскажите популярно про ссылки и указатели
Ответ Создать тему
Опции темы

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