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

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

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

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

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

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

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

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

110
4226 / 1795 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
05.01.2013, 13:59 41
Author24 — интернет-сервис помощи студентам
Цитата Сообщение от Nixy Посмотреть сообщение
если внимательно подебажить то в si_1 записывается, 4 символа, которые si_2 переводятся в число, число же потом переводится в 16 ричную систему и выводится на экран, это не адрес как вам кажется а представление того мустора коим заполнена переменная
C++
1
cout<<si_2;
выводит именно значение указателя, то есть адрес.
1
ComfyMobile
401 / 282 / 34
Регистрация: 24.07.2012
Сообщений: 916
05.01.2013, 14:01 42
taras atavin, хотя да, ты прав ,это адрес, меня смутило что он очень похож у меня на содержимое
0
5231 / 3204 / 362
Регистрация: 12.12.2009
Сообщений: 8,116
Записей в блоге: 2
05.01.2013, 14:01 43
Цитата Сообщение от Nixy Посмотреть сообщение
так выведет содержимое адреса в первом случае это Н а во втором, int число всего муссора
Собственно, что и пытаемся объяснить ТС'у - в первом случае в стек положится/извлечется 1 байт, а во втором 4.
0
6 / 6 / 0
Регистрация: 10.10.2012
Сообщений: 140
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 ?
0
1181 / 894 / 94
Регистрация: 03.08.2011
Сообщений: 2,461
05.01.2013, 14:16 45
gomodril, имя статического массива почти тоже самое, что и константный указатель. Как отдельной переменной, этого указателя не существует в программе, нельзя взять его адрес. Но можно использовать для присваивания другим указателям.

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

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

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

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

gomodril, никаких неявных преобразований, эти записи идентичны. По сути любой массив это последовательность байт, и можно лишь взять адрес начала этой последовательности. Нельзя сделать ссылку на массив. Думаю, задание немного некорректно, и Вы сделали именно то, чего от Вас хотели.
0
6 / 6 / 0
Регистрация: 10.10.2012
Сообщений: 140
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
0
1181 / 894 / 94
Регистрация: 03.08.2011
Сообщений: 2,461
05.01.2013, 14:39 52
gomodril, это будет ссылка на первый элемент массива, а не на сам массив.
1
6 / 6 / 0
Регистрация: 10.10.2012
Сообщений: 140
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;
Правильно ли я выполнил задание?
0
1181 / 894 / 94
Регистрация: 03.08.2011
Сообщений: 2,461
05.01.2013, 16:42 54
Это не указатель на массив строк. А массив указателей на строковые литералы. А строковые литералы являются константами. Поэтому верная запись будет выглядеть вот так:
C++
1
2
3
const char *m_str_1[] = {"Kisa1",
                         "Kisa2",
                         "Kisa3"}
0
4226 / 1795 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
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];
присваивает указателю адрес массива и получается указатель на массив. Но синоним всего массива и синоним его элемента не синонимичны друг другу, а ссылка - это синоним самой сущности.
0
Croessmah
05.01.2013, 16:44
  #56

Не по теме:

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

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

Добавлено через 2 минуты
Цитата Сообщение от Croessmah Посмотреть сообщение
Смотря с какой стороны посмотреть.
Согласно языку.
0
1181 / 894 / 94
Регистрация: 03.08.2011
Сообщений: 2,461
05.01.2013, 16:57 58
Причем тут этажи на английском? Люди ведут счет с единицы. 1 апельсин, 2 апельсина и так далее. А в C++ индексация идет с 0. Просто, видать, посчитали, что так логичнее, так как для первого элемента не нужно делать никаких смещений. Для второго уже нужно сделать смещение на 1 элемент и тд. В любой нормальной книге объясняется, что первый элемент имеет индекс 0.
0
5231 / 3204 / 362
Регистрация: 12.12.2009
Сообщений: 8,116
Записей в блоге: 2
05.01.2013, 16:57 59
Цитата Сообщение от Toshkarik Посмотреть сообщение
Нельзя сделать ссылку на массив
Но можно сделать ссылку на указатель на массив.
0
4226 / 1795 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
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 апельсина и так далее.
Не путай номер с количеством, апельсин может быть пятнадцатым из миллиарда.
0
05.01.2013, 17:03
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
05.01.2013, 17:03
Помогаю со студенческими работами здесь

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
60
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru