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

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

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

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

04.01.2013, 16:05. Просмотров 5619. Ответов 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
Kastaneda
Jesus loves me
Эксперт С++
4689 / 2893 / 236
Регистрация: 12.12.2009
Сообщений: 7,356
Записей в блоге: 2
Завершенные тесты: 1
04.01.2013, 18:39 #31
Цитата Сообщение от taras atavin Посмотреть сообщение
содержит адрес в своём коде, ну так он и грузится в то же месте в процессоре, куда грузится код операции.
не понял, ты про конвейер говоришь? Или что? Так это уже дело "железяки", т.е. это уже не низкий уровень, а уровень железа. Это вообще к программирования отношения не имеет.
Цитата Сообщение от taras atavin Посмотреть сообщение
Дело не в сегменте, можно и в сегменте кода отвести область для данных. Но это будет именно область данных, процессор в неё не переходит.
то, что это область данных - это условность, о которой будет знать только программист, у дескриптора сегмента кода все равно стоит флаг "execute", поэтому область данных все равно будет в сегменте кода. А управление туда не передается, потому что программист его туда не передает. А на практике ни что не мешает исполнится данным, как коду.
0
gomodril
6 / 6 / 0
Регистрация: 10.10.2012
Сообщений: 132
05.01.2013, 10:03  [ТС] #32
taras atavin,

А что тогда будет являться указателем на символ:
C++
1
2
char si = 'H';
char *si_1 = &si;
или
C++
1
2
char si = 'H';
int *si_2 = (int*) &si
Добавлено через 15 часов 23 минуты
taras atavin,

Если я правильно понимаю идеологию C++, то оба кода будут являться указателем на символ и написаны они правильно.
C++
1
2
char si = 'H';
char *si_1 = &si;
C++
1
2
char si = 'H';
int *si_2 = (int*) &si;
0
Nick Alte
Эксперт С++
1640 / 1012 / 119
Регистрация: 27.09.2009
Сообщений: 1,945
Завершенные тесты: 1
05.01.2013, 10:54 #33
Указатель содержит адрес, и ему самому абсолютно всё равно, адрес чего именно. Чтобы избежать путаницы, компилятор ведёт типы указателей, которые и говорят ему о том, что по данному адресу содержится. И есть возможность сказать компилятору что-то вроде: "Хотя это адрес переменной типа char, считай, что по этому адресу лежит значение типа int. Поверьте, я знаю, что я делаю!". Что и делается во втором примере. Заметим, что char у нас занимает 1 байт, а int - 4. И если мы попытаемся прочитать значение, на которое указывает si_2, то он вытянет и первый байт, который 'H', и 3 следующих за ним, в которых неизвестно что, так что в результате мы получим не пойми какое число.
0
gomodril
6 / 6 / 0
Регистрация: 10.10.2012
Сообщений: 132
05.01.2013, 13:37  [ТС] #34
Цитата Сообщение от Nick Alte Посмотреть сообщение
Указатель содержит адрес, и ему самому абсолютно всё равно, адрес чего именно. Чтобы избежать путаницы, компилятор ведёт типы указателей, которые и говорят ему о том, что по данному адресу содержится. И есть возможность сказать компилятору что-то вроде: "Хотя это адрес переменной типа char, считай, что по этому адресу лежит значение типа int. Поверьте, я знаю, что я делаю!". Что и делается во втором примере. Заметим, что char у нас занимает 1 байт, а int - 4. И если мы попытаемся прочитать значение, на которое указывает si_2, то он вытянет и первый байт, который 'H', и 3 следующих за ним, в которых неизвестно что, так что в результате мы получим не пойми какое число.
Странно, у меня получается наоборот почему то, si_1 вытаскивает непонятно чего, а si_2 вытаскивает адрес где находится переменная si. Вот код:
C++
1
2
3
4
5
6
7
char si = 'H';
char* si_1 = &si;
int* si_2 = (int*) &si;
 
std::cout << "Символьная переменная 'si' = " << si << endl;
std::cout << "Указатель на адрес в char = " << si_1 << endl;
std::cout << "Указатель на адрес в int = " << si_2 << endl;
0
taras atavin
3570 / 1753 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
05.01.2013, 13:46 #35
Цитата Сообщение от gomodril Посмотреть сообщение
А что тогда будет являться указателем на символ:
C++
1
2
char si = 'H';
char *si_1 = &si;
C++
1
2
char si = 'H';
int *si_2 = (int*) &si
валидны оба, но на символ указывает только первый вариант, второй - это указатель на целое, содержащее символ в одном из своих байтов.
1
Nixy
ComfyMobile
400 / 281 / 8
Регистрация: 24.07.2012
Сообщений: 916
05.01.2013, 13:49 #36
Цитата Сообщение от gomodril Посмотреть сообщение
si_1 вытаскивает непонятно чего, а si_2 вытаскивает адрес где находится переменная s
если внимательно подебажить то в si_1 записывается, 4 символа, которые si_2 переводятся в число, число же потом переводится в 16 ричную систему и выводится на экран, это не адрес как вам кажется а представление того мустора коим заполнена переменная
1
Nick Alte
Эксперт С++
1640 / 1012 / 119
Регистрация: 27.09.2009
Сообщений: 1,945
Завершенные тесты: 1
05.01.2013, 13:50 #37
Цитата Сообщение от gomodril Посмотреть сообщение
Странно, у меня получается наоборот почему то, si_1 вытаскивает непонятно чего, а si_2 вытаскивает адрес где находится переменная si.
Адрес char при выводе в поток интерпретируется как адрес строки, поэтому выводится содержимое памяти по этому адресу вплоть до первого нулевого байта. Начинаться такая строка будет с 'H', а дальше - что получится. Указатели других типов выводятся по своему значению, именно как адрес.
2
Kastaneda
Jesus loves me
Эксперт С++
4689 / 2893 / 236
Регистрация: 12.12.2009
Сообщений: 7,356
Записей в блоге: 2
Завершенные тесты: 1
05.01.2013, 13:51 #38
Цитата Сообщение от gomodril Посмотреть сообщение
у меня получается наоборот почему то, si_1 вытаскивает непонятно чего
оператор << для char* перегружен таким образом, что он будет выводить данные по указателю, воспринимая их как символы, до тех пор, пока не встретит символ 0. Попробуй так
C++
1
2
std::cout << *si_1 << std::endl;
std::cout << *si_2 << std::endl;
1
taras atavin
3570 / 1753 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
05.01.2013, 13:57 #39
Цитата Сообщение от gomodril Посмотреть сообщение
Странно, у меня получается наоборот почему то, si_1 вытаскивает непонятно чего, а si_2 вытаскивает адрес где находится переменная si. Вот код:
C++
1
2
3
4
5
6
char si = 'H';
char* si_1 = &si;
int* si_2 = (int*) &si;
std::cout << "Символьная переменная 'si' = " << si << endl;
std::cout << "Указатель на адрес в char = " << si_1 << endl;
std::cout << "Указатель на адрес в int = " << si_2 << endl;
Функции и операторы ввода/вывода не догадываются об указателях на отдельные символы и принимают их за указатели на нуль-терминальные строки. И почему наоборот? По адресу валяется не известное число, а не сам указатель не понятен.
1
Nixy
ComfyMobile
400 / 281 / 8
Регистрация: 24.07.2012
Сообщений: 916
05.01.2013, 13:57 #40
Цитата Сообщение от Kastaneda Посмотреть сообщение
std::cout << *si_1 << std::endl;
std::cout << *si_2 << std::endl;
так выведет содержимое адреса в первом случае это Н а во втором, int число всего муссора
0
taras atavin
3570 / 1753 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
05.01.2013, 13:59 #41
Цитата Сообщение от Nixy Посмотреть сообщение
если внимательно подебажить то в si_1 записывается, 4 символа, которые si_2 переводятся в число, число же потом переводится в 16 ричную систему и выводится на экран, это не адрес как вам кажется а представление того мустора коим заполнена переменная
C++
1
cout<<si_2;
выводит именно значение указателя, то есть адрес.
1
Nixy
ComfyMobile
400 / 281 / 8
Регистрация: 24.07.2012
Сообщений: 916
05.01.2013, 14:01 #42
taras atavin, хотя да, ты прав ,это адрес, меня смутило что он очень похож у меня на содержимое
0
Kastaneda
Jesus loves me
Эксперт С++
4689 / 2893 / 236
Регистрация: 12.12.2009
Сообщений: 7,356
Записей в блоге: 2
Завершенные тесты: 1
05.01.2013, 14:01 #43
Цитата Сообщение от Nixy Посмотреть сообщение
так выведет содержимое адреса в первом случае это Н а во втором, int число всего муссора
Собственно, что и пытаемся объяснить ТС'у - в первом случае в стек положится/извлечется 1 байт, а во втором 4.
0
gomodril
6 / 6 / 0
Регистрация: 10.10.2012
Сообщений: 132
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
Toshkarik
1143 / 860 / 51
Регистрация: 03.08.2011
Сообщений: 2,390
Завершенные тесты: 1
05.01.2013, 14:16 #45
gomodril, имя статического массива почти тоже самое, что и константный указатель. Как отдельной переменной, этого указателя не существует в программе, нельзя взять его адрес. Но можно использовать для присваивания другим указателям.

Добавлено через 1 минуту
В Вашем примере Вы берете не адрес массива, а адрес его первого элемента. Можно было бы просто написать
C++
1
int *mas_2 = mas_1;
0
05.01.2013, 14:16
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
05.01.2013, 14:16
Привет! Вот еще темы с ответами:

Расскажите про 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; ...


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

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

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