Форум программистов, компьютерный форум CyberForum.ru

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Nikitko_Cent
131 / 101 / 8
Регистрация: 27.10.2011
Сообщений: 648
Завершенные тесты: 2
#1

Не могу что-то понять с указателями - C++

24.11.2012, 13:00. Просмотров 391. Ответов 8
Метки нет (Все метки)

Объясните мне,пожалуйста, почему когда я пишу так:

C++
1
2
3
4
5
6
7
8
9
10
11
void main()
{
    char arr[]="erbb45";
    char *parr = &arr[0];
 
    cout << hex;
    cout << &parr << " ";
    cout << &arr;
 
    system("PAUSE");
}
То на выходе получаю разные адреса (со смещением 4 байта). Ведь в си++ массив представлен как бы адресом его первого элемента. Т.е. &arr = &arr[0] . Я вывожу адрес parr, т.е. адрес &arr[0] (char *parr = &arr[0]). И затем вывожу &arr(т.е. тот же самый &arr[0]). Или я чего-то не понимаю?

И еще. Почему когда я пишу

C++
1
cout << &arr[0]
То получаю "erbb45" т.е. сам массив? & - это же раскрытие адреса
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
0x10
2452 / 1624 / 238
Регистрация: 24.11.2012
Сообщений: 3,999
24.11.2012, 13:07     Не могу что-то понять с указателями #2
Все логично.
&parr и &arr - адреса самих указателей. Поскольку это две разные переменные, то и их адреса будут различны. Размер указателя на 32-битных системах как раз 4 байта, это смещение Вы и получаете.
Адрес же массива хранится в указателе и совпадает с адресом нулевого элемента. Т.е. arr == &arr[0].
Kuzia domovenok
1887 / 1742 / 117
Регистрация: 25.03.2012
Сообщений: 5,916
Записей в блоге: 1
24.11.2012, 13:34     Не могу что-то понять с указателями #3
что ты присвоил то и будет одинаковым. Ты присвоил parr значение &arr[0]
Вот и выводи cout<<parr, cout<<&arr[0] если хочешь видеть одинаковые значения
Nikitko_Cent
131 / 101 / 8
Регистрация: 27.10.2011
Сообщений: 648
Завершенные тесты: 2
24.11.2012, 13:36  [ТС]     Не могу что-то понять с указателями #4
Цитата Сообщение от Kuzia domovenok Посмотреть сообщение
что ты присвоил то и будет одинаковым. Ты присвоил parr значение &arr[0]
cout<<&arr[0]
Я ж говорю если я пишу cout<<&arr[0] мне на выход отдаётся весь массив (т.е. "erbb45")
0x10
2452 / 1624 / 238
Регистрация: 24.11.2012
Сообщений: 3,999
24.11.2012, 13:37     Не могу что-то понять с указателями #5
Nikitko_Cent, с чего такой вывод? В данном случае &arr[0] означает ровно то, что записано - адрес нулевого элемента. Он же хранится в переменной arr.

Upd: я идиот, сорри)
Nikitko_Cent
131 / 101 / 8
Регистрация: 27.10.2011
Сообщений: 648
Завершенные тесты: 2
24.11.2012, 13:41  [ТС]     Не могу что-то понять с указателями #6
Цитата Сообщение от Kuzia domovenok Посмотреть сообщение
Вот и выводи cout<<parr
И так когда пишу тоже отдаёт "erbb45"
Kuzia domovenok
1887 / 1742 / 117
Регистрация: 25.03.2012
Сообщений: 5,916
Записей в блоге: 1
24.11.2012, 13:44     Не могу что-то понять с указателями #7
Цитата Сообщение от Nikitko_Cent Посмотреть сообщение
Я ж говорю если я пишу cout<<&arr[0] мне на выход отдаётся весь массив (т.е. "erbb45")
Ну да, указатель на нулевой(и вообще) символ интерпретируется как строка. Не знаю как через cout вывести,
но printf выведет эти указатели так
C++
1
printf("%p %p", &arr[0], parr);
Nikitko_Cent
131 / 101 / 8
Регистрация: 27.10.2011
Сообщений: 648
Завершенные тесты: 2
24.11.2012, 13:48  [ТС]     Не могу что-то понять с указателями #8
Цитата Сообщение от Kuzia domovenok Посмотреть сообщение
Ну да, указатель на нулевой(и вообще) символ интерпретируется как строка. Не знаю как через cout вывести,
но printf выведет эти указатели так
C++
1
printf("%p %p", &arr[0], parr);
О_о оказывается, между cout и printf есть различия...видимо, намучаюсь я с изучением плюсов .

Спасибо всем за помощь
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
24.11.2012, 13:51     Не могу что-то понять с указателями
Еще ссылки по теме:

Обьясните что не так не могу понять C++
Не могу понять, что это значит: while(i<10/2) C++
C++ Никак не могу понять что это
C++ Не могу понять, что неправильно с float
C++ Не могу понять что за ошибка в коде

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
0x10
2452 / 1624 / 238
Регистрация: 24.11.2012
Сообщений: 3,999
24.11.2012, 13:51     Не могу что-то понять с указателями #9
Nikitko_Cent, ну тут дело в том, что у оператора<< есть функция, которая принимает const char*, вызвается как раз она http://www.cplusplus.com/reference/i...perator%3C%3C/
Yandex
Объявления
24.11.2012, 13:51     Не могу что-то понять с указателями
Ответ Создать тему
Опции темы

Текущее время: 06:06. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru