Модераторы: Daevaorn

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Для начинающих, кто занимаеться по -Е.Л. Шиманович С/С++ 
:(
    Опции темы
Metixa
Дата 15.11.2006, 18:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 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
PM MAIL   Вверх
JackYF
Дата 15.11.2006, 19:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


полуавантюрист
****


Профиль
Группа: Участник
Сообщений: 5814
Регистрация: 28.8.2004
Где: страна тысячи озё р

Репутация: 18
Всего: 162



nameofmas - локальная переменная. Адрес 0-го элемента массива.
&nameofmas - адрес этой локальной переменной, который в общем случае никак не связан с адресом 1-го элемента.

НО!

Для статических одномерных массиввов это одно и то же, так как память выделяется в стеке, а самого указателя как такового отдельного нету...

Может плохо объяснил...
В любом случае &nameofmas лучше не пользоваться... зачем?



--------------------
Пожаловаться на меня как модератора можно здесь.
PM MAIL Jabber   Вверх
Fazil6
Дата 15.11.2006, 19:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1653
Регистрация: 3.5.2006
Где: Минск

Репутация: 35
Всего: 60



имя массива - rvalue и такое подятие как адрес с ним не связано. 
Цитата

 д е     з а п и с ы в а е т с я с а м а n a m e o f m a s?

нигде
PM MAIL   Вверх
JackYF
Дата 15.11.2006, 19:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


полуавантюрист
****


Профиль
Группа: Участник
Сообщений: 5814
Регистрация: 28.8.2004
Где: страна тысячи озё р

Репутация: 18
Всего: 162



Цитата(Fazil6 @  15.11.2006,  19:48 Найти цитируемый пост)
имя массива - rvalue и такое подятие как адрес с ним не связано. 


Но адрес-то существует. Переменная-то есть.



--------------------
Пожаловаться на меня как модератора можно здесь.
PM MAIL Jabber   Вверх
Fazil6
Дата 15.11.2006, 19:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1653
Регистрация: 3.5.2006
Где: Минск

Репутация: 35
Всего: 60



Цитата

Но адрес-то существует. Переменная-то есть.

имя массива это не переменная.  Единственный адрес с которым оно связано - адрес первого элемента.
PM MAIL   Вверх
Metixa
Дата 15.11.2006, 20:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 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---- это же тоже последовательность котрый гдето надо запи с а т ь, а где, он же не может висеть на "воздух"...

извините за зацикливания, но пока не докапаюсь до к о н ц а, не могу продолжать учебу (может быть вредная привичка...) smile 
PM MAIL   Вверх
Fazil6
Дата 15.11.2006, 22:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1653
Регистрация: 3.5.2006
Где: Минск

Репутация: 35
Всего: 60



почитай
http://faqs.org.ru/progr/c_cpp/cfaqrus.htm
там в п.2 эти вопросы перетираются
PM MAIL   Вверх
Metixa
Дата 15.11.2006, 22:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 42
Регистрация: 29.10.2006

Репутация: нет
Всего: нет



Цитата(Fazil6 @  15.11.2006,  22:09 Найти цитируемый пост)
почитай
http://faqs.org.ru/progr/c_cpp/cfaqrus.htm
там в п.2 эти вопросы перетираются 


благодарю Fazil6 

НО:

 Объявление массива
    "char a[6];" требует определенного места для шести символов, которое
    будет известно под именем "a". То есть,    существует место под именем
    "a", в которое могут быть помещены 6 символов.

как понять - "под именем "a". "?  где компилятор прочитает что это имя "а" а не "Gospodin_Karuzo" ?????
PM MAIL   Вверх
Metixa
Дата 16.11.2006, 12:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 42
Регистрация: 29.10.2006

Репутация: нет
Всего: нет



почему ++ к имени массива требует lvalue (понятно что имя массива константа) а если этот argv дается  main - у из командной строки тогда
к ++argv -- "зеленный цвет"?
PM MAIL   Вверх
Fazil6
Дата 16.11.2006, 13:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1653
Регистрация: 3.5.2006
Где: Минск

Репутация: 35
Всего: 60



Цитата

а если этот argv дается  main - у из командной строки тогда
к ++argv -- "зеленный цвет"?

в параметрах функций массив преобразуется просто к указателю 
PM MAIL   Вверх
Dov
Дата 16.11.2006, 16:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


аСинизатор
***


Профиль
Группа: Завсегдатай
Сообщений: 1721
Регистрация: 10.5.2003
Где: Эрец-Исраэль

Репутация: 15
Всего: 88



Цитата(Metixa @  15.11.2006,  18:40 Найти цитируемый пост)
где записывается сама nameofmas, по какому адресу, он же все таки указатель - константа?


Цитата(Metixa @  15.11.2006,  22:57 Найти цитируемый пост)
 Объявление массива    "char a[6];" требует определенного места для шести символов, которое    будет известно под именем "a". То есть,    существует место под именем    "a", в которое могут быть помещены 6 символов.как понять - "под именем "a". "?  где компилятор прочитает что это имя "а" а не "Gospodin_Karuzo" ?????


Ну, что ж, попробую и я объяснить необъяснимое.

                                         Указатели и массивы.
В языке С существует очень тесная связь между указателями и массивами.
Любое действие, которое можно совершить с помощью массивов, можно так же сделать и с помощью указателей.
   Когда мы объявляем массив:
Код
int X[8];

то это значит, что X - это массив из 8 элементов, имеющих тип int и расположенных в ячейках памяти 
непрерывно. Это даёт нам возможность обращаться к элементам массива по индексу, начиная с X[0] и до X[7].
    Схематично это можно изобразить так:
Код
               -------------------------------------------------------------------------
               |  X[0]  |  X[1]  |  X[2]  |  X[3]  |  X[4]  |  X[5]  |  X[6]  |  X[7]  |
               -------------------------------------------------------------------------

Таким образом, когда мы объявляем массив, то это значит, что мы объявляем непрерывность ячеек в
памяти и плюс к этому мы объявляем указатель, в котором хранится адрес начала массива в
памяти компьютера. Этим указателем и является имя массива, в нём же и содержится адрес первого
элемента массива, т.е. адрес элемента с индексом 0, т.е. адрес X[0].
   Схематично это можно изобразить так:
Код
 -----------
 |указатель|
 -----------\
             \
              | 
            --V----------------------------------------------------------------------
            |  X[0]  |  X[1]  |  X[2]  |  X[3]  |  X[4]  |  X[5]  |  X[6]  |  X[7]  |
            -------------------------------------------------------------------------

Например, если массив начинается с адреса 1000, то X[0] находится по адресу 1000, X[1] - по адресу
1004, X[2] - по адресу 1008 и т.д.(при условии, что тип int - 4 байта).
   Схематично это можно изобразить так:
Код
   ---------
   | 1000  | - указатель
   ---------
             
               1000     1004     1008     1012     1016     1020     1024     1028
            -------------------------------------------------------------------------
            |  X[0]  |  X[1]  |  X[2]  |  X[3]  |  X[4]  |  X[5]  |  X[6]  |  X[7]  |
            -------------------------------------------------------------------------

То есть, можно сказать, что указатель, в котором хранится адрес первого элемента массива - это
особая ячейка памяти, а его имя - это имя массива. Надеюсь, понятно. Тогда идём дальше.

                         Имя массива, как указатель.
Напомню ещё разок: имя указателя, в котором хранится адрес первого элемента массива - это имя
самого массива.
Когда мы объявляем массив элементов типа int, это значит, что имя массива - это переменная типа int*,
т.е. указатель на тип int.
Когда мы объявляем массив элементов типа double, это значит, что имя массива - это переменная типа
double*, т.е. указатель на тип double и т.д.
Например:
Код
long arr[5];

Когда мы объявили массив arr, то мы объявили 5 непрерывных ячеек в памяти типа long и ещё мы объявили
дополнительную переменную с именем arr (типа long*), хранящую адрес первой ячейки массива. Если массив
начинается с адреса 2020, то схематично это можно изобразить так(если тип long занимает 4 байта):
Код
   ---------
   | 2020  | - arr
   ---------
             
                2020       2024       2028       2032       2036     
            --------------------------------------------------------
            |  arr[0]  |  arr[1]  |  arr[2]  |  arr[3]  |  arr[4]  |  
            --------------------------------------------------------

Все элементы массива arr - это элементы типа long. Имя массива arr - это переменная типа long* и она
содержит адрес первой ячейки массива, т.е. адрес arr[0].

                            Применение имени массива, как указателя.
Объявляем массив:
Код
int ar[5];

Не забываем, что аr - это переменная типа int*, потому что аr содержит адрес ячейки типа int, т.е.
аr - это указатель на тип int. Попробуем использовать аr так, как мы бы использовали любой другой
указатель.
Код
*ar = 10;  // можно

Если ar - указатель на тип int, то *ar - это содержимое ячейки памяти, адрес которой хранится в ar,
т.е. это равнозначно:
Код
ar[0] = 10;

Как и равнозначны следующие две записи:
Код
scanf("%d", &ar[0]);
scanf("%d", ar);

                             Разница между именем массива и указателем.
Указатель - это всё же переменная и мы можем изменять её значение. Имя массива - это хоть и указатель,
но имеющий постоянный адрес, который изменить мы не можем.

Пример:
Код
long  id[450], total;
long* iptr = id;

id++;          // нельзя
iptr++;        // можно 

id = &total;   // нельзя
iptr = &total; // можно


Пока всё.  smile  

Это сообщение отредактировал(а) Dov - 17.11.2006, 01:21


--------------------
Тут вечности запах томительный,
И свежие фрукты дешевые, 
А климат у нас – изумительный, 
И только соседи – #уевые. 
                           Игорь Губерман.
PM   Вверх
Fazil6
Дата 16.11.2006, 17:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1653
Регистрация: 3.5.2006
Где: Минск

Репутация: 35
Всего: 60



Цитата

Когда мы объявляем массив элементов типа int, это значит, что имя массива - это переменная типа int*,
т.е. указатель на тип int.
нет

Цитата(Dov @  16.11.2006,  16:49 Найти цитируемый пост)
Например:код C++1:long arr[5];highlightSyntax('cpp_lYTVhN','cpp');highlightSyntax('cpp_lYTVhN','cpp');Когда мы объявили массив arr, то мы объявили 5 непрерывных ячеек в памяти типа long и ещё мы объявилидополнительную переменную с именем arr (типа long*), хранящую адрес первой ячейки массива. Все элементы массива arr - это элементы типа long. Имя массива arr - это переменная типа long* и она содержит адрес первой ячейки массива, т.е. адрес arr[0].


нет. 
arr имеет тип long[5], а не long*.  
arr может использоваться как long * const, но не long*. Повторю еще раз имя массива - это  не переменная.
единствено  при передаче массива в параметрах функции передается переменная типа указатель-на-типэлементамассива(неконстантный).


PM MAIL   Вверх
Dov
Дата 16.11.2006, 17:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


аСинизатор
***


Профиль
Группа: Завсегдатай
Сообщений: 1721
Регистрация: 10.5.2003
Где: Эрец-Исраэль

Репутация: 15
Всего: 88



Цитата(Fazil6 @  16.11.2006,  17:20 Найти цитируемый пост)
нет. arr имеет тип long[5], а не long*.  arr может использоваться как long * const, но не long*. Повторю еще раз имя массива - это  не переменная.единствено  при передаче массива в параметрах функции передается переменная типа указатель-на-типэлементамассива(неконстантный).

Fazil6, ты пытаешься спорить, не понимая о чём. Ты до конца дочитал? Если да, то прочти ещё раз, но повнимательнее, а потом поговорим.  smile 




--------------------
Тут вечности запах томительный,
И свежие фрукты дешевые, 
А климат у нас – изумительный, 
И только соседи – #уевые. 
                           Игорь Губерман.
PM   Вверх
Fazil6
Дата 16.11.2006, 17:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1653
Регистрация: 3.5.2006
Где: Минск

Репутация: 35
Всего: 60



Цитата

ты пытаешься спорить, не понимая о чём. Ты до конца дочитал?

и что же я не понял?
PM MAIL   Вверх
Dov
Дата 16.11.2006, 18:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


аСинизатор
***


Профиль
Группа: Завсегдатай
Сообщений: 1721
Регистрация: 10.5.2003
Где: Эрец-Исраэль

Репутация: 15
Всего: 88



Цитата(Fazil6 @  16.11.2006,  17:43 Найти цитируемый пост)
и что же я не понял?


Цитата(Fazil6 @  16.11.2006,  17:20 Найти цитируемый пост)
arr может использоваться как long * const, но не long*

Оттого, что arr -  const, он не перестал быть long *, т.е. он по-прежнему хранит адрес, а значит он является указателем на тип long, а указатели на тип long имеют тип  long *. К тому же, он может изменять значения своих элементов, как обычный указатель.

Цитата(Dov @  16.11.2006,  16:49 Найти цитируемый пост)
*ar = 10;  // можно




--------------------
Тут вечности запах томительный,
И свежие фрукты дешевые, 
А климат у нас – изумительный, 
И только соседи – #уевые. 
                           Игорь Губерман.
PM   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.1479 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.