![]() |
Модераторы: Daevaorn Страницы: (9) Все « Первая ... 2 3 [4] 5 6 ... Последняя »
( Перейти к первому непрочитанному сообщению ) |
![]() ![]() ![]() |
|
Metixa |
|
|||
Новичок Профиль Группа: Участник Сообщений: 42 Регистрация: 29.10.2006 Репутация: нет Всего: нет |
мне очень интересно следующее:
возмем int nameofmas[] = {1,2,3,4}; понятно по теории что nameofmas это адрес первого элемента масcива и nameofmas то же самое что &nameofmas[0] оба выдает адрес первого элемента (+1 вопрос, почему cout<<nameofmas; и cout<<&nameofmas; - выдает одно и тоже ?); где записывается сама nameofmas, по какому адресу, он же все таки указатель - константа? я сфантазировал так : значит, гдето както сама nameofmas обьявлено как char строка - указатель, и еще он указывает на первый элемент массива и поетому он впыхнулся в "бутерброд" адреса первого элемента и cout<<nameofmas; и cout<<&nameofmas[0]; выдает одно и тоже.. "бутерброд" - назвал потому что на одном адресе записан и первый элемент и имя массива-констуказатель (что странно выгледит), а если это не так, тогда г д е з а п и с ы в а е т с я с а м а n a m e o f m a s??????? Это сообщение отредактировал(а) Metixa - 15.11.2006, 18:44 |
|||
|
||||
JackYF |
|
|||
![]() полуавантюрист ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 5814 Регистрация: 28.8.2004 Где: страна тысячи озё р Репутация: 18 Всего: 162 |
nameofmas - локальная переменная. Адрес 0-го элемента массива.
&nameofmas - адрес этой локальной переменной, который в общем случае никак не связан с адресом 1-го элемента. НО! Для статических одномерных массиввов это одно и то же, так как память выделяется в стеке, а самого указателя как такового отдельного нету... Может плохо объяснил... В любом случае &nameofmas лучше не пользоваться... зачем? |
|||
|
||||
Fazil6 |
|
|||
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1653 Регистрация: 3.5.2006 Где: Минск Репутация: 35 Всего: 60 |
имя массива - rvalue и такое подятие как адрес с ним не связано.
нигде |
|||
|
||||
JackYF |
|
|||
![]() полуавантюрист ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 5814 Регистрация: 28.8.2004 Где: страна тысячи озё р Репутация: 18 Всего: 162 |
Но адрес-то существует. Переменная-то есть. |
|||
|
||||
Fazil6 |
|
|||
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1653 Регистрация: 3.5.2006 Где: Минск Репутация: 35 Всего: 60 |
имя массива это не переменная. Единственный адрес с которым оно связано - адрес первого элемента. |
|||
|
||||
Metixa |
|
|||
Новичок Профиль Группа: Участник Сообщений: 42 Регистрация: 29.10.2006 Репутация: нет Всего: нет |
имя массива же есть конст указатель, а как без адреса, вот имя масива да: nameofmas, как он может быть без адреса,
n a m, потом e..o..f.m..a..s---- это же тоже последовательность котрый гдето надо запи с а т ь, а где, он же не может висеть на "воздух"... извините за зацикливания, но пока не докапаюсь до к о н ц а, не могу продолжать учебу (может быть вредная привичка...) Добавлено @ 20:50 имя массива же есть конст указатель, а как без адреса, вот имя масива да: nameofmas, как он может быть без адреса, n a m, потом e..o..f.m..a..s---- это же тоже последовательность котрый гдето надо запи с а т ь, а где, он же не может висеть на "воздух"... извините за зацикливания, но пока не докапаюсь до к о н ц а, не могу продолжать учебу (может быть вредная привичка...) ![]() |
|||
|
||||
Fazil6 |
|
|||
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1653 Регистрация: 3.5.2006 Где: Минск Репутация: 35 Всего: 60 |
||||
|
||||
Metixa |
|
|||
Новичок Профиль Группа: Участник Сообщений: 42 Регистрация: 29.10.2006 Репутация: нет Всего: нет |
благодарю Fazil6 НО: Объявление массива "char a[6];" требует определенного места для шести символов, которое будет известно под именем "a". То есть, существует место под именем "a", в которое могут быть помещены 6 символов. как понять - "под именем "a". "? где компилятор прочитает что это имя "а" а не "Gospodin_Karuzo" ????? |
|||
|
||||
Metixa |
|
|||
Новичок Профиль Группа: Участник Сообщений: 42 Регистрация: 29.10.2006 Репутация: нет Всего: нет |
почему ++ к имени массива требует lvalue (понятно что имя массива константа) а если этот argv дается main - у из командной строки тогда
к ++argv -- "зеленный цвет"? |
|||
|
||||
Fazil6 |
|
|||
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1653 Регистрация: 3.5.2006 Где: Минск Репутация: 35 Всего: 60 |
в параметрах функций массив преобразуется просто к указателю |
|||
|
||||
Dov |
|
||||||||||||||||||||||||
![]() аСинизатор ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1721 Регистрация: 10.5.2003 Где: Эрец-Исраэль Репутация: 15 Всего: 88 |
Ну, что ж, попробую и я объяснить необъяснимое. Указатели и массивы. В языке С существует очень тесная связь между указателями и массивами. Любое действие, которое можно совершить с помощью массивов, можно так же сделать и с помощью указателей. Когда мы объявляем массив:
то это значит, что X - это массив из 8 элементов, имеющих тип int и расположенных в ячейках памяти непрерывно. Это даёт нам возможность обращаться к элементам массива по индексу, начиная с X[0] и до X[7]. Схематично это можно изобразить так:
Таким образом, когда мы объявляем массив, то это значит, что мы объявляем непрерывность ячеек в памяти и плюс к этому мы объявляем указатель, в котором хранится адрес начала массива в памяти компьютера. Этим указателем и является имя массива, в нём же и содержится адрес первого элемента массива, т.е. адрес элемента с индексом 0, т.е. адрес X[0]. Схематично это можно изобразить так:
Например, если массив начинается с адреса 1000, то X[0] находится по адресу 1000, X[1] - по адресу 1004, X[2] - по адресу 1008 и т.д.(при условии, что тип int - 4 байта). Схематично это можно изобразить так:
То есть, можно сказать, что указатель, в котором хранится адрес первого элемента массива - это особая ячейка памяти, а его имя - это имя массива. Надеюсь, понятно. Тогда идём дальше. Имя массива, как указатель. Напомню ещё разок: имя указателя, в котором хранится адрес первого элемента массива - это имя самого массива. Когда мы объявляем массив элементов типа int, это значит, что имя массива - это переменная типа int*, т.е. указатель на тип int. Когда мы объявляем массив элементов типа double, это значит, что имя массива - это переменная типа double*, т.е. указатель на тип double и т.д. Например:
Когда мы объявили массив arr, то мы объявили 5 непрерывных ячеек в памяти типа long и ещё мы объявили дополнительную переменную с именем arr (типа long*), хранящую адрес первой ячейки массива. Если массив начинается с адреса 2020, то схематично это можно изобразить так(если тип long занимает 4 байта):
Все элементы массива arr - это элементы типа long. Имя массива arr - это переменная типа long* и она содержит адрес первой ячейки массива, т.е. адрес arr[0]. Применение имени массива, как указателя. Объявляем массив:
Не забываем, что аr - это переменная типа int*, потому что аr содержит адрес ячейки типа int, т.е. аr - это указатель на тип int. Попробуем использовать аr так, как мы бы использовали любой другой указатель.
Если ar - указатель на тип int, то *ar - это содержимое ячейки памяти, адрес которой хранится в ar, т.е. это равнозначно:
Как и равнозначны следующие две записи:
Разница между именем массива и указателем. Указатель - это всё же переменная и мы можем изменять её значение. Имя массива - это хоть и указатель, но имеющий постоянный адрес, который изменить мы не можем. Пример:
Пока всё. ![]() Это сообщение отредактировал(а) Dov - 17.11.2006, 01:21 -------------------- Тут вечности запах томительный, И свежие фрукты дешевые, А климат у нас – изумительный, И только соседи – #уевые. Игорь Губерман. |
||||||||||||||||||||||||
|
|||||||||||||||||||||||||
Fazil6 |
|
|||
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1653 Регистрация: 3.5.2006 Где: Минск Репутация: 35 Всего: 60 |
нет. arr имеет тип long[5], а не long*. arr может использоваться как long * const, но не long*. Повторю еще раз имя массива - это не переменная. единствено при передаче массива в параметрах функции передается переменная типа указатель-на-типэлементамассива(неконстантный). |
|||
|
||||
Dov |
|
|||
![]() аСинизатор ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1721 Регистрация: 10.5.2003 Где: Эрец-Исраэль Репутация: 15 Всего: 88 |
Fazil6, ты пытаешься спорить, не понимая о чём. Ты до конца дочитал? Если да, то прочти ещё раз, но повнимательнее, а потом поговорим. ![]() -------------------- Тут вечности запах томительный, И свежие фрукты дешевые, А климат у нас – изумительный, И только соседи – #уевые. Игорь Губерман. |
|||
|
||||
Fazil6 |
|
|||
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1653 Регистрация: 3.5.2006 Где: Минск Репутация: 35 Всего: 60 |
и что же я не понял? |
|||
|
||||
Dov |
|
|||
![]() аСинизатор ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1721 Регистрация: 10.5.2003 Где: Эрец-Исраэль Репутация: 15 Всего: 88 |
Оттого, что arr - const, он не перестал быть long *, т.е. он по-прежнему хранит адрес, а значит он является указателем на тип long, а указатели на тип long имеют тип long *. К тому же, он может изменять значения своих элементов, как обычный указатель. -------------------- Тут вечности запах томительный, И свежие фрукты дешевые, А климат у нас – изумительный, И только соседи – #уевые. Игорь Губерман. |
|||
|
||||
![]() ![]() ![]() |
Правила форума "С++:Общие вопросы" | |
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |