Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 32, средняя оценка - 4.84
gomodril
6 / 6 / 0
Регистрация: 10.10.2012
Сообщений: 132
#1

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

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

Помогите разобраться со ссылками и указателями на различные объекты. Запутался вообще в них полностью. Когда читаю книгу про них, то вроде все понятно написано, но примеров для меня видимо не достаточно, что бы как то их различать. В итоге начинаю решать задачи и ни чего не выходит.
0
Лучшие ответы (1)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
04.01.2013, 16:05
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Расскажите популярно про ссылки и указатели (C++):

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

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

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

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

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

Расскажите пожалуйста про флаги - C++
Доброго времени суток. Помогите пожалуйста разобраться с фалагми. Вот код: #include <iostream> #define ID_F 1001 #define ID_D 1002 ...

110
gomodril
6 / 6 / 0
Регистрация: 10.10.2012
Сообщений: 132
05.01.2013, 14:21  [ТС] #46
Цитата Сообщение от Toshkarik Посмотреть сообщение
gomodril, имя статического массива почти тоже самое, что и константный указатель. Как отдельной переменной, этого указателя не существует в программе, нельзя взять его адрес. Но можно использовать для присваивания другим указателям.

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

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

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

gomodril, никаких неявных преобразований, эти записи идентичны. По сути любой массив это последовательность байт, и можно лишь взять адрес начала этой последовательности. Нельзя сделать ссылку на массив. Думаю, задание немного некорректно, и Вы сделали именно то, чего от Вас хотели.
0
gomodril
6 / 6 / 0
Регистрация: 10.10.2012
Сообщений: 132
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
Toshkarik
1147 / 864 / 51
Регистрация: 03.08.2011
Сообщений: 2,404
Завершенные тесты: 1
05.01.2013, 14:39 #52
gomodril, это будет ссылка на первый элемент массива, а не на сам массив.
1
gomodril
6 / 6 / 0
Регистрация: 10.10.2012
Сообщений: 132
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
Toshkarik
1147 / 864 / 51
Регистрация: 03.08.2011
Сообщений: 2,404
Завершенные тесты: 1
05.01.2013, 16:42 #54
Это не указатель на массив строк. А массив указателей на строковые литералы. А строковые литералы являются константами. Поэтому верная запись будет выглядеть вот так:
C++
1
2
3
const char *m_str_1[] = {"Kisa1",
                         "Kisa2",
                         "Kisa3"}
0
taras atavin
3570 / 1754 / 91
Регистрация: 24.11.2009
Сообщений: 27,567
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
taras atavin
3570 / 1754 / 91
Регистрация: 24.11.2009
Сообщений: 27,567
05.01.2013, 16:51 #57
Цитата Сообщение от Toshkarik Посмотреть сообщение
taras atavin, первого элемента, а не нулевого. Первый элемент с нулевым индексом. Это разные вещи. Счет идет с единицы, индексация в C++ идет с 0.
Например, по-английски, first floor (первый этаж) - это тот, который сразу над ground floor, но ground floor - нифига не подвальный этаж, а самый нижний этаж над уровнем грунта. Так что порядковые номера не очень то определены, у англичан 0 - вполне натуральное число. А индексы однозначны.

Добавлено через 2 минуты
Цитата Сообщение от Croessmah Посмотреть сообщение
Смотря с какой стороны посмотреть.
Согласно языку.
0
Toshkarik
1147 / 864 / 51
Регистрация: 03.08.2011
Сообщений: 2,404
Завершенные тесты: 1
05.01.2013, 16:57 #58
Причем тут этажи на английском? Люди ведут счет с единицы. 1 апельсин, 2 апельсина и так далее. А в C++ индексация идет с 0. Просто, видать, посчитали, что так логичнее, так как для первого элемента не нужно делать никаких смещений. Для второго уже нужно сделать смещение на 1 элемент и тд. В любой нормальной книге объясняется, что первый элемент имеет индекс 0.
0
Kastaneda
Jesus loves me
Эксперт С++
4697 / 2901 / 238
Регистрация: 12.12.2009
Сообщений: 7,385
Записей в блоге: 2
Завершенные тесты: 1
05.01.2013, 16:57 #59
Цитата Сообщение от Toshkarik Посмотреть сообщение
Нельзя сделать ссылку на массив
Но можно сделать ссылку на указатель на массив.
0
taras atavin
3570 / 1754 / 91
Регистрация: 24.11.2009
Сообщений: 27,567
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
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
05.01.2013, 17:03
Привет! Вот еще темы с ответами:

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

Расскажите про "тру" метод парсинга строки - C++
Опять Добрый день!))) Ой как я ошибался говоря что с парсингом не будет проблем((( Код void GetDirList(const char *Target) { ...

Ссылки и указатели - C++
Добрый день. Возможно было. В чем существенная разница между передачей данных в функцию по ссылке или указателю. В каких случаях вы бы...

Указатели и Ссылки - C++
извеняюсь,но никак не могу понять. int sum(int* inLeft, int* inRight) { if(inLeft == inRight) return *inLeft; ...


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

Или воспользуйтесь поиском по форуму:
60
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.