![]() |
|
Модераторы: bsa |
![]()
|
|
| feodorv |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2214 Регистрация: 30.7.2011 Репутация: 12 Всего: 45 |
Это очень смелое утверждение -------------------- Напильник, велосипед, грабли и костыли - основные инструменты программиста... |
|||
|
||||
| aleksandrkr |
|
|||
![]() Новичок Профиль Группа: Участник Сообщений: 6 Регистрация: 19.9.2013 Репутация: нет Всего: нет |
да я с вами согласен я не совсем точно объяснил, точнее я немного исказил реальность дабы донести суть проблемы до новичка.
правда на самом деле в переменной хорониться только адрес в памяти. int P = 10; cout << &P <<endl; //адресс cout <<P <<endl; //значение; http://www.firststeps.ru/asm/r.php?35 Это сообщение отредактировал(а) aleksandrkr - 19.9.2013, 17:23 |
|||
|
||||
| bsa |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9185 Регистрация: 6.4.2006 Где: Москва, Россия Репутация: 85 Всего: 196 |
Это в указателе хранится адрес. А вот массив - это не указатель. Он может быть приведен к указателю (явно или не явно). Но фактически это единая переменная. Переменная - это просто набор данных в памяти. И естественно, известен ее адрес. Другое дело, что адрес может ВЫЧИСЛЯТЬСЯ в процессе работы программы или может быть вшит в нее жестко. Поэтому утверждение о том, что переменная состоит из двух частей имеет столько же смысла, сколько: "моя квартира состоит из двух частей: адрес и помещение". |
|||
|
||||
| aleksandrkr |
|
|||
![]() Новичок Профиль Группа: Участник Сообщений: 6 Регистрация: 19.9.2013 Репутация: нет Всего: нет |
1)переменная типа массив это указатель на его первый элемент.
int arr[10] ={0}; int * p = arr + (sizeof(int) * 4) ; аналогично записи arr[4]; 2)int pr; эта запись в процессе компиляции будет заменена на asm { MODEL SMALL STACK 256 DATASEG Data1 DB 31h ; выделить один байт с содержимым 31h CODESEG Start: mov ax,@data ; установка в ds адреса mov ds,ax ; сегмента данных mov ax,OFFSET Data1 ; где находиться переменная End Start } компилятор сам просчитает где ляжет переменная и везде где он встретит pr он заменит pr на полученный адрес 0xbfd86d6c Указатель — это переменная, содержащая адрес некоторого элемента данных (переменной, константы, функции, структуры). В языке C указатели тесно связаны с обработкой массивов и строк Бьерн Страуструп. Язык программирования С++ 1.3.2 Переменные и арифметические операции Каждое имя и каждое выражение обязаны иметь тип. Именно тип определяет операции, которые могут выполняться над ними. Например, в описании int inch; говорится, что inch имеет тип int, т.е. inch является целой переменной. Описание - это оператор, который вводит имя в программу. В описании указывается тип имени. Тип, в свою очередь, определяет как правильно использовать имя или выражение. Основные типы, наиболее приближенные к "аппаратной реальности" машины, таковы: char short int long Они представляют целые числа. Следующие типы: float double long double представляют числа с плавающей точкой. Переменная типа char имеет размер, нужный для хранения одного символа на данной машине (обычно это один байт). Переменная int имеет размер, необходимый для целой арифметики на данной машине (обычно это одно слово). Следующие арифметические операции можно использовать над любым сочетанием перечисленных типов: + (плюс, унарный и бинарный) - (минус, унарный и бинарный) * (умножение) / (деление) % (остаток от деления) То же верно для операций отношения: == (равно) != (не равно) < (меньше чем) <= (меньше или равно) >= (больше или равно) Для операций присваивания и арифметических операций в С++ выполняются все осмысленные преобразования основных типов, чтобы их можно было неограниченно использовать любые их сочетания: double d; int i; short s; // ... d = d + i; i = s * i; Символ = обозначает обычное присваивание. 1.3.3 Указатели и массивы Массив можно описать так: char v [ 10 ]; // массив из 10 символов Описание указателя имеет такой вид: char * p; // указатель на символ Здесь [] означает "массив из", а символ * означает "указатель на". Значение нижней границы индекса для всех массивов равно нулю, поэтому v имеет 10 элементов: v [ 0 ] ... v [ 9 ]. Переменная типа указатель может содержать адрес объекта соответствующего типа: p = & v [ 3 ]; // p указывает на 4-й элемент массива v Унарная операция & означает взятие адреса. |
|||
|
||||
| feodorv |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2214 Регистрация: 30.7.2011 Репутация: 12 Всего: 45 |
Ну вот зачем такое писать -------------------- Напильник, велосипед, грабли и костыли - основные инструменты программиста... |
|||
|
||||
| aleksandrkr |
|
|||
![]() Новичок Профиль Группа: Участник Сообщений: 6 Регистрация: 19.9.2013 Репутация: нет Всего: нет |
точно извиняюсь sizeof лишний
Добавлено через 7 минут и 20 секунд у кого нибудь стоит 6 студия. проверти эту запись. short * p = arr + 4; оно правильно отработает или нет. Добавлено через 8 минут и 44 секунды по идеи оно работать не должно. |
|||
|
||||
| feodorv |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2214 Регистрация: 30.7.2011 Репутация: 12 Всего: 45 |
-------------------- Напильник, велосипед, грабли и костыли - основные инструменты программиста... |
|||
|
||||
| bsa |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9185 Регистрация: 6.4.2006 Где: Москва, Россия Репутация: 85 Всего: 196 |
Это не так. Массив ведет себя аналогично указателю в большинстве случаев. Но в ряде случаев он отличается: передача массива в качестве параметра шаблонной функции, sizeof. Поэтому нельзя говорить, что массив это указатель. |
|||
|
||||
| volatile |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2107 Регистрация: 7.1.2011 Репутация: 16 Всего: 85 |
||||
|
||||
![]()
|
| Правила форума "C/C++: Для новичков" | |
|
|
Запрещается! 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Для новичков | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |