|
|
Регистрация Восстановить пароль |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
|
|
Опции темы | Поиск в этой теме |
19.08.2015, 09:29 | #61 | ||
Белик Виталий :)
Старожил
Регистрация: 23.07.2007
Сообщений: 57,097
|
Цитата:
Цитата:
I'm learning to live...
|
||
19.08.2015, 13:47 | #62 |
Старожил
Регистрация: 19.08.2009
Сообщений: 2,119
|
Smitt&Wesson
Если мы передадим в вызываемую функцию просто созданный массив, то внутри вызываемой функции мы получим только его копию. ... Мы получим ссылку на уже созданный массив и функция будет обрабатывать именно его. Как мы видим, функция ничего не возвратила в явном виде. Но это не так. Исходный массив был изменён и возвращён функцией через её параметры. смешались в кучу люди, кони... :D по пунктам: в какой-то функции был создан пустой локальный массив: int N = 100; int * array = new int[N]; это не массив, а указатель на целое. Если мы передадим в вызываемую функцию просто созданный массив, то внутри вызываемой функции мы получим только его копию. если это настоящий с++, а не паленая китайская копия низкого качества, то передать копию массива в качестве аргумента нельзя. от слова совсем. такие дела. Мы получим ссылку на уже созданный массив никакой ссылки вы не получите. будет передана копия указателя. Исходный массив был изменён и возвращён функцией через её параметры. функция ничего не возвращает через параметры. в таком варианте функция может модифицировать область адрес начала которой сохранен в переданном указателе.
А вы почему со мной не соглашаетесь, у вас что, импотенция? (c) ACE Valery
|
27.08.2015, 03:51 | #63 |
t45t
Участник клуба
Регистрация: 20.03.2012
Сообщений: 1,849
|
С примером Смита разобрался, и тут же вопрос:
Что если в аргументах только указатель на массив, а его размер-неизвестен, то применение цикла for будет нерелевантно, а вот цикл с предусловием- в самый раз. Как, например , получить сумму элементов массива, не зная его размера? Почему именно просуммировать - потому что еще не умею возвращать массивы. Поэтому пока акцент на void-функцию. Была идея вернуть указатель на массив структур, но как потом с этим всем работать-не знаю, в гугле глухо. И второй вопрос. Что значит: Вернуть ссылку из функции. Вернуть ссылку из указателя на функцию (надеюсь так сказал, пример в первом посте) Зачем вообще возвращать ссылки? Зачем в аргументах функции ссылки тогда, когда можно взять указатель? Да, я читал о ссылках, хороших примеров не нашел кроме int x; int *p=&x; Оттуда и вопрос. А в лабораторных мы ссылки нигде, кроме как в scanf("%d",&...)не использовали, поэтому оттуда и непонятки.
from dark to light)
Последний раз редактировалось Вадим Мошев; 30.08.2017 в 20:32. |
27.08.2015, 05:05 | #64 |
Участник клуба
Регистрация: 30.07.2008
Сообщений: 1,604
|
У центрального процессора есть регистры. В регистре могут храниться какие-то данные или адрес на данные в памяти. Указатель - это регистр процессора, в котором находится адрес данных. Указатели - это низкоуровневый механизм доступа к данным.
>>МойКласс new_obj; >>МойКласс *new_obj; В первом случае создается экземпляр класса. Во втором случае экземпляр класса не создается. Обращение по такому указателю может быть ошибкой, так как сперва требуется динамически выделить память под класс. >>3) *token = expr[i]; - эта строчка тоже не ясна, ведь объявили переменную не как указательную Имя массива в С является указателем. & является унарным оператором получения адреса операнда в выражении. То есть &i получает адрес хранения переменной i в памяти. Описание унарного оператора & находится в части 6.5.3.2 международного стандарта языка С по ISO (Международная организация по стандартизации). результат выполнения оператора & - указатель на тип. Память процесса является виртуальной. Есть виртуальное адресное пространство процесса (virtual address space) https://msdn.microsoft.com/ru-ru/lib...(v=vs.85).aspx который не представляет действительно физическое размещение объекта в оперативной памяти. Система создает страничную таблицу для каждого процесса, которая используется для трансляции виртуальных адресов в физические. Размер виртуального адресного пространства для процесса - 4 гигабайта. Оно разделено на две партиции: одну для использования процессом и другую для использования системой >>1) Функция объявлена как указатель-для чего? Объявление результата, возвращаемого функцией - произвол программиста. Программист выбирает, в каком виде функция должна возвратить значение. Код:
>>Зачем вообще возвращать ссылки? Описание ссылок в разделе 8.3.2 стандарта языка C++ ISO 2011 года. Ссылка возвращается для изменения некоторых данных. В стандарте приведен пример: Код:
Ссылка это адрес данных. На низком уровне (ассемблер) это выглядит так Код:
В С++ есть механизм перегрузки операторов (overloaded operators), в нем могут использоваться ссылки. В стандарте дан пример: Код:
При перегрузке операторов в классах, не получится взять указатель. Оператор это как бы функция. Например, класс cout использует перегруженный оператор <<, что позволяет записывать конструкции вида cout << 5 << 3.14 << endl;
"SPACE.THE FINAL FRONTIER.This's a voyage of starship Enterprise. It's 5-year mission to explore strange new worlds,to seek out new life and civilizations,to boldly go where no man has gone before"
|
27.08.2015, 05:09 | #65 |
Участник клуба
Регистрация: 30.07.2008
Сообщений: 1,604
|
Пример на встроенном ассемблере для объяснения как операторы, указатели, ссылки, массивы C/C++ реализуются на уровне процессора
Код:
"SPACE.THE FINAL FRONTIER.This's a voyage of starship Enterprise. It's 5-year mission to explore strange new worlds,to seek out new life and civilizations,to boldly go where no man has gone before"
|
27.08.2015, 05:32 | #66 |
t45t
Участник клуба
Регистрация: 20.03.2012
Сообщений: 1,849
|
Спасибо, но все равно не очень понял суть. Зачем ссылка при перегрузке оператора? Чтоб например при перегрузке + ,
Программа видела числа слева и справа? В интернете искал банальные перегрузки, где действие + изменяется на умножение. Не нашел. Суть понимаю зачем нужна перегрузка. Есть ли наглядный пример, объясняющий- зачем ссылки при перегрузке? Извиняюсь за тупняк.
from dark to light)
|
27.08.2015, 06:04 | #67 | |
Участник клуба
Регистрация: 30.07.2008
Сообщений: 1,604
|
Цитата:
Если их откопировать в новую переменную, то данные не будут сохраняться. Пример Код:
"SPACE.THE FINAL FRONTIER.This's a voyage of starship Enterprise. It's 5-year mission to explore strange new worlds,to seek out new life and civilizations,to boldly go where no man has gone before"
|
|
27.08.2015, 06:30 | #68 |
t45t
Участник клуба
Регистрация: 20.03.2012
Сообщений: 1,849
|
Спасибо большое.
А вот на счет mov и lea, откопал старый асм код... Вывод и ввод строки символов. Тут, по вашей логике, если так понял lea передает указатель на первый элемент np1. Код:
Тут тоже, а потом используется косвенная адресация, так что, наверное, я не так все понял, или поведение lea зависит от ah? Код:
from dark to light)
|
27.08.2015, 06:54 | #69 |
Участник клуба
Регистрация: 30.07.2008
Сообщений: 1,604
|
lea - load effective address (загрузить эффективный адрес)
Код:
В lea в 16-битный регистр dx помещается адрес последовательности байтов np1 В ah номер требуемой функции dos от прерывания. Описание прерываний DOS : http://www.codenet.ru/progr/dos/int_0026.php Int (wikipedia): https://ru.wikipedia.org/wiki/Int_(%...0%B8%D1%8F_x86)
"SPACE.THE FINAL FRONTIER.This's a voyage of starship Enterprise. It's 5-year mission to explore strange new worlds,to seek out new life and civilizations,to boldly go where no man has gone before"
|
27.08.2015, 07:01 | #70 |
t45t
Участник клуба
Регистрация: 20.03.2012
Сообщений: 1,849
|
Да, спасибо большое. Жаль нет функий преобразования строки символов в число.
from dark to light)
|
|
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
указатели | salmon172 | Паскаль, Turbo Pascal, PascalABC.NET | 0 | 31.05.2011 21:34 |
указатели | Артэс | Общие вопросы C/C++ | 4 | 07.09.2010 11:08 |
Указатели | Анютик_sexi | Помощь студентам | 3 | 16.06.2010 14:38 |
Указатели | AquaticSoul | Общие вопросы C/C++ | 5 | 22.12.2009 15:13 |
[C] массивы, указатели, двойные указатели. | Iggel | Общие вопросы C/C++ | 5 | 05.05.2009 12:39 |