0 / 0 / 0
Регистрация: 19.12.2012
Сообщений: 6
|
||||||||||||||||
1 | ||||||||||||||||
Указатели. Не понимаю19.12.2012, 03:27. Показов 1849. Ответов 18
Метки нет (Все метки)
Разбираю указатели, слегка запнулся на одном месте.
У меня есть функция:
Судя по книжке, которую я читаю, & - взятие адреса. То есть получается, я передаю в функцию адрес. А внутри её использую как обычную переменную. При попытке написать что-то в стиле "*x *= 2;" компилятор пишет, что неверно. Почему так? Добавлено через 20 минут Также есть небольшая ситуация. Возможно использования массивов через указатели, то есть.
0
|
19.12.2012, 03:27 | |
Ответы с готовыми решениями:
18
не совсем понимаю код *указатели Правильно ли я понимаю ссылки и указатели. Работу с ними. Я сам прокомментировал код. Скажите правильно или нет. Указатели и указатели на указатели, а также типы данных Через указатели на указатели посчитать сумму двух чисел и записать в третье |
3 / 3 / 1
Регистрация: 25.06.2012
Сообщений: 13
|
|
19.12.2012, 03:35 | 2 |
на сколько я знаю, знак амперсанда используется не только для взятия адреса, а и для работы с ссылочными типами данных.
По поводу массивов мне кажется что его элементы не разбросаны и идут друг за другом.
0
|
0 / 0 / 0
Регистрация: 19.12.2012
Сообщений: 6
|
|
19.12.2012, 03:46 [ТС] | 3 |
0
|
3257 / 2059 / 351
Регистрация: 24.11.2012
Сообщений: 4,909
|
|
19.12.2012, 03:48 | 4 |
Функция, принимающая целочисленный аргумент по ссылке.
Добавлено через 41 секунду Взятие адреса указателя на нулевой элемент массива.
0
|
0 / 0 / 0
Регистрация: 19.12.2012
Сообщений: 6
|
|
19.12.2012, 03:51 [ТС] | 5 |
0
|
3 / 3 / 1
Регистрация: 25.06.2012
Сообщений: 13
|
|||||||||||||||||||||
19.12.2012, 03:54 | 6 | ||||||||||||||||||||
описал на сколько я себе это представляю.
1
|
0 / 0 / 0
Регистрация: 19.12.2012
Сообщений: 6
|
|
19.12.2012, 04:09 [ТС] | 7 |
Я прекрасно понимаю, как работает второй вариант. Только с первым непонятки. Если я передаю значение, почему тогда переменная изменяется? Или я передаю значение вместе с ссылкой? (то есть саму переменную??...) Добавлено через 2 минуты Всё же, всегда ли элементы массива идут друг за дружкой? Что происходит, если невозможно выделить массив одним куском?
0
|
3257 / 2059 / 351
Регистрация: 24.11.2012
Сообщений: 4,909
|
|
19.12.2012, 04:14 | 8 |
Создается ссылка, которая инициализируется объектом.
А как иначе-то? Предполагаю, что происходит пичалька. (объяснил, да? =) )
2
|
0 / 0 / 0
Регистрация: 19.12.2012
Сообщений: 6
|
|
19.12.2012, 04:17 [ТС] | 9 |
Понятно, что примерно выходит )
Следующий вопрос будет: как можно предусмотреть такую ситуацию и предотвратить печальку? )
0
|
~ Эврика! ~
1256 / 1005 / 74
Регистрация: 24.07.2012
Сообщений: 2,002
|
|
19.12.2012, 04:22 | 10 |
1. Всегда.
2. Память не выделяется. А дальше в зависимости от настроек и т. п. возможны три варианта: a) есть вариант new с дополнительным аргументом, который заставит new просто вернуть NULL; б) по умолчанию new выбрасывает исключение std::bad_alloc; в) с помощью set_new_handler() можно установить функцию-обработчик на этот случай, которая должна или повыбрасывать всякий мусор, чтобы new попробовала выделить память ещё раз, или выбросить std::bad_alloc или прибить программу, если она облажалась с высвобождением.
1
|
Модератор
8908 / 6677 / 918
Регистрация: 14.02.2011
Сообщений: 23,521
|
||||||||||||||||
19.12.2012, 07:25 | 11 | |||||||||||||||
ошибка будет
вот такая нет в С массивов как например в Фортране есть указатель на область памяти где лежит массив а этим
значит надо писать так если тебе нужна копия указателя
и это равнозначно p = arr
0
|
OhMyGodSoLong
|
19.12.2012, 09:16
#12
|
0
|
4226 / 1795 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
|
||||||||||||||||
19.12.2012, 09:55 | 13 | |||||||||||||||
extremist38, указатель есть данное, хранящее адрес подпрограммы, или другого данного. Кратный указатель есть данное, хранящее адрес другого указателя. Указатель, хранящий адрес указателя, хранящего адрес не указателя, называется двойным указателем, указатель, хранящий адрес указателя, хранящего адрес указателя, хранящего адрес указателя, называется тройным указателем и так далее. Сколько указателей нужно использовать, чтоб добраться до не указателя, такова и кратность указателя. Адрес есть значение самого указателя. Адрес есть номер байта в памяти, с которого начинается то, чей это адрес. Например, адрес переменной есть номер байта в памяти, с которого начинается эта переменная. Ссылка есть синоним другой переменной. Можно считать, что ссылка ведёт себя, как неявно разыменуемый при каждом обращении к нему указатель. Но стандарт не гарантирует реализацию ссылок через указатели, вместо этого ссылка может быть реализована дублированием адреса в таблице переменных компилятора, а в готовом коде будет прямая адресация, то есть доступ по адресу в коде программы, а не в данном. Исключение - передаваемые по ссылкам параметры неинлайновых функций и передаваемые по ссылкам операнды неинлайновых перегруженных операторов, в этом случае альтернативные реализации не возможны и ссылка становится синтаксической надстройкой над указателем. Разыменование указателя есть операция доступа не к самому указателю, а к тому, чей адрес он хранит, на низком уровне разыменованию соответствует операция косвенной адресации.
Добавлено через 2 минуты
Добавлено через 1 минуту Нет. У тебя этот оператор стоит в декларации, а в этом случае & означает, что следующий идентификатор есть имя ссылки. Добавлено через 3 минуты Они не разбрасываются, классический массив - это единый блок, не путай его с массивами-объектами, которые могут быть реализованы на чём угодно, включая списки. Но тогда каждый элемент будет хранить адрес следующего, а оператор ++ для указателя перегружается на копирование адреса следующего элемента из текущего. Добавлено через 4 минуты Массивы в c/c++ есть, просто они реализованы на указателях. Но
1
|
0 / 0 / 0
Регистрация: 19.12.2012
Сообщений: 6
|
||||||
19.12.2012, 10:30 [ТС] | 14 | |||||
Спасибо за объяснение. Тогда такой вопрос:
Будет ли реализация через ссылку
0
|
Модератор
8908 / 6677 / 918
Регистрация: 14.02.2011
Сообщений: 23,521
|
|
19.12.2012, 11:31 | 16 |
необходимо договорится, что такое массив набор сущностный ( тогда есть) другая сущность (тогда нету)
0
|
Модератор
8908 / 6677 / 918
Регистрация: 14.02.2011
Сообщений: 23,521
|
|
19.12.2012, 11:37 | 18 |
да будет реализована через ссылку
вопрос в том как в конкретном компиляторе реализована ссылка о чем и говорил taras atavin, будь то или или еще как тебя это не должно волновать в любом случае ты получишь корректный результат
1
|
4226 / 1795 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
|
|||||||||||||||||||||
19.12.2012, 18:05 | 19 | ||||||||||||||||||||
Лучше указатель, или нет, может зависеть от различных внешних факторов. Может большинство фактических параметров - динамические данные, или элементы массива, перебираемого адресной арифметикой? Тогда указатель просто удобней синтаксически, так как в случае ссылки его придётся разыменовывать, а при передаче по указателю динамическое данное, или элемент массива, перебираемого адресной арифметикой, можно передавать без дополнительных операций:
Добавлено через 3 минуты Согласен. Добавлено через 2 часа 56 минут
1
|
19.12.2012, 18:05 | |
19.12.2012, 18:05 | |
Помогаю со студенческими работами здесь
19
Почему Лафоре использует указатели на указатели, вместо обмена значениями указателей? Указатели на указатели с числами. Почему можно присвоить число в 4-ый элемент, если массив из 2 элементов? Есть три переменные. Используя указатели на указатели, поменять значение максимальной и минимальной переменной Зачем нужны все эти указатели (или не указатели) Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |