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

Почему выводится весь массив - C++

Восстановить пароль Регистрация
 
Roman_G
0 / 0 / 0
Регистрация: 16.04.2012
Сообщений: 26
12.10.2012, 09:41     Почему выводится весь массив #1
Доброго времени суток!
Прошу прощения за нубский вопорс, но окончательно запутался. В указателе на массив хранится АДРЕС первого элемента массива, так? Но почему тогда при выполнении кода
C++
1
2
3
int *p, str[20];
p = str;
cout << p;
выводится адрес str[0], а при выполнении кода
C++
1
2
3
char *p, str[20];
p = str;
cout << p;
выводится ВЕСЬ МАССИВ?
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Герц
523 / 340 / 4
Регистрация: 05.11.2010
Сообщений: 1,077
Записей в блоге: 1
12.10.2012, 10:07     Почему выводится весь массив #2
Потому что char* это C-строка.
Roman_G
0 / 0 / 0
Регистрация: 16.04.2012
Сообщений: 26
12.10.2012, 10:32  [ТС]     Почему выводится весь массив #3
Т.е. "в принципе" char* это не указатель, а в большей степени строковый тип данных С?
Герц
523 / 340 / 4
Регистрация: 05.11.2010
Сообщений: 1,077
Записей в блоге: 1
12.10.2012, 10:36     Почему выводится весь массив #4
char* это указатель на char. Ты вполне можешь использовать его как ( byte ), но для потоков ввода/вывода C++ char* останется null-terminated строкой, а char - одиночным символом. Хочешь вывести именно значение указателя или код символа - используй приведение типов.
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
12.10.2012, 11:09     Почему выводится весь массив #5
Потому что cout << так работает. Если обрабатывает указатель на char, то считает, что это указатель на строку. Будет выводить содержимое памяти, начиная с адреса p, пока не встретит '\0'. Если нужно получить адрес начала строки, то нужно привести уазатель на строку к типу void*:
C++
1
2
3
char *p, str[20];
p = str;
cout << (void*)p;
Deviaphan
Делаю внезапно и красиво
Эксперт C++
 Аватар для Deviaphan
1283 / 1217 / 50
Регистрация: 22.03.2011
Сообщений: 3,744
12.10.2012, 11:11     Почему выводится весь массив #6
Напиши cout << (void*)p; и будет тебе счастье.)
Snaiffer
2 / 2 / 0
Регистрация: 13.03.2011
Сообщений: 18
12.10.2012, 11:25     Почему выводится весь массив #7
Цитата Сообщение от Roman_G Посмотреть сообщение
Т.е. "в принципе" char* это не указатель, а в большей степени строковый тип данных С?
Нет, char* это именно указатель. Просто здесь имеет место особенность в том как cout его обрабатывает.
cout начинает выводить значения ячеек памяти с того адреса который ты ему передал в "p" до символа '\0'. Имменно поэтому и получается так что он выводит всю твою строку.

Для наглядности попробуй сделать вот так:
C++
1
2
3
4
char ch = 'W';
char str[] = "hello";
char *pch = &ch;
cout << pch << endl;
В результате ты получишь "Whello". Т.е. сначала у нас выделяется память под ch и в ячейку памяти записывается символ 'W', затем выделяется память под массив символов "hello" только тут компилятор еще добавляет к этому массиву и символ '\0'.
В итоге у нас в памяти содержится:
______________________
| W | h | e | l | l | o | \0 |

далее запускается cout и считывает все до '\0'
Roman_G
0 / 0 / 0
Регистрация: 16.04.2012
Сообщений: 26
12.10.2012, 11:26  [ТС]     Почему выводится весь массив #8
большое спасибо, разобрался.
taras atavin
Ушёл с форума.
 Аватар для taras atavin
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
12.10.2012, 11:36     Почему выводится весь массив #9
Цитата Сообщение от Roman_G Посмотреть сообщение
Т.е. "в принципе" char* это не указатель, а в большей степени строковый тип данных С?
Нет, именно указатель, но любой валидный адрес с равным успехом может быть адресом и конкретного элемента, и начала массива, соответственно и указатель с одним и тем же значением с равным успехом может указывать и на конкретный элемент, и на начало массива. Поэтому функции и операторы, работающие с указателями, могут интерпретировать их так и так, всё зависит от конкретного оператора/функции.
C++
1
2
3
4
char s[20]="sdfah fdfd";
char *p=s[0];
cout<<p; // Выводит строку
cout<<*p; // Выводит символ
C++
1
2
3
4
int s[20]={1, 2, 4, 6, 3, 0, 7, 9, 8, 32, 321, 43, 54, 432, 43, 523, 53, 55, 35, 53};
char *p=s[0];
cout<<p; // Выводит адрес начала массива
cout<<*p; // Выводит нулевой элемент
. Функции, интерпретирующие указатель, как указатель на массив могут:
1. Подразумевать конкретный размер.
2. Принимать размер специальным параметром.
3. Принимать специальное значение за признак конца массива, тогда такое значение называется терминальным.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
12.10.2012, 12:08     Почему выводится весь массив
Еще ссылки по теме:

C++ IDE wxDev-C++, при создании кнопки на форме она почему-то становится во весь экран, почему?
C++ Почему выводится ноль?
C++ Почему выводится в виде таблицы и почему не работает сортировка

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

Или воспользуйтесь поиском по форуму:
CheshireCat
Эксперт С++
2907 / 1235 / 78
Регистрация: 27.05.2008
Сообщений: 3,307
12.10.2012, 12:08     Почему выводится весь массив #10
Цитата Сообщение от Snaiffer Посмотреть сообщение

В результате ты получишь "Whello". Т.е. сначала у нас выделяется память под ch и в ячейку памяти записывается символ 'W', затем выделяется память под массив символов "hello" только тут компилятор еще добавляет к этому массиву и символ '\0'.
В итоге у нас в памяти содержится:
______________________
| W | h | e | l | l | o | \0 |

далее запускается cout и считывает все до '\0'
Что будет выведено на самом деле - неизвестно. То, что получилось "Whello" - просто везение, частный случай, зависящий от расположения звезд и фазы луны. Нет ровно никаких гарантий, что переменные ch и str будут расположены не только "вплотную" друг к другу, но и что они будут расположены вообще в смежных областях памяти (привет от архитектур, отличных от x86!).

Так что поэкспериментировать можно, но при этом нужно отдавать себе отчет в том, что полученные результаты справедливы только для определенного сочетания аппаратной архитектуры + ОС + компилятора, и могут резко измениться при изменении любого из них.
Yandex
Объявления
12.10.2012, 12:08     Почему выводится весь массив
Ответ Создать тему
Опции темы

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