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

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

Войти
Регистрация
Восстановить пароль
 
Roman_G
0 / 0 / 0
Регистрация: 16.04.2012
Сообщений: 26
#1

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

12.10.2012, 09:41. Просмотров 436. Ответов 9
Метки нет (Все метки)

Доброго времени суток!
Прошу прощения за нубский вопорс, но окончательно запутался. В указателе на массив хранится АДРЕС первого элемента массива, так? Но почему тогда при выполнении кода
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;
выводится ВЕСЬ МАССИВ?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
12.10.2012, 09:41
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Почему выводится весь массив (C++):

Почему при выводе в поток char* выводится весь массив символов? - C++
я немогу вот в чем разобраться есть : int main() { char v = &quot;Fdasda&quot;; char *p=v; cout &lt;&lt; &quot;\np=&quot; &lt;&lt; p; cout &lt;&lt; &quot;\n*p=&quot; &lt;&lt;*p; ...

Почему не полностью выводится массив? - C++
Массив MyY не полностью выводится. В чем может быть проблема? Заранее спасибо. const n2max=5; const n1max=10; class cl1 { int...

Почему неправильно выводится массив? - C++
Не пойму... массив arr выводится неправильно, если его выводить в main.Получается что-то типа &quot;-858993460&quot; .В cifr он выводится нормально ...

Не соображу почему не выводится массив - C++
Код: #include &lt;iostream&gt; #include &lt;cstdlib&gt; #include &lt;ctime&gt; using namespace std; void func( int a, int b) ...

Почему матрица выводится как обычный массив - C++
//matriza.h #pragma once class matriza { float *b,max,s; int n,m,nom; public: matriza(); void ww_matriza();

IDE wxDev-C++, при создании кнопки на форме она почему-то становится во весь экран, почему? - C++
То есть ребята не смешно ни разу. Создаю форму, кидаю кнопку, ничего не предвещает плохого. Собираю проект, запускаю- и вот кнопка размером...

9
Герц
524 / 341 / 4
Регистрация: 05.11.2010
Сообщений: 1,077
Записей в блоге: 1
12.10.2012, 10:07 #2
Потому что char* это C-строка.
0
Roman_G
0 / 0 / 0
Регистрация: 16.04.2012
Сообщений: 26
12.10.2012, 10:32  [ТС] #3
Т.е. "в принципе" char* это не указатель, а в большей степени строковый тип данных С?
0
Герц
524 / 341 / 4
Регистрация: 05.11.2010
Сообщений: 1,077
Записей в блоге: 1
12.10.2012, 10:36 #4
char* это указатель на char. Ты вполне можешь использовать его как ( byte ), но для потоков ввода/вывода C++ char* останется null-terminated строкой, а char - одиночным символом. Хочешь вывести именно значение указателя или код символа - используй приведение типов.
0
alsav22
5425 / 4820 / 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;
0
Deviaphan
Делаю внезапно и красиво
Эксперт С++
1305 / 1220 / 50
Регистрация: 22.03.2011
Сообщений: 3,744
12.10.2012, 11:11 #6
Напиши cout << (void*)p; и будет тебе счастье.)
0
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'
0
Roman_G
0 / 0 / 0
Регистрация: 16.04.2012
Сообщений: 26
12.10.2012, 11:26  [ТС] #8
большое спасибо, разобрался.
0
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. Принимать специальное значение за признак конца массива, тогда такое значение называется терминальным.
0
CheshireCat
Эксперт С++
2893 / 1242 / 78
Регистрация: 27.05.2008
Сообщений: 3,389
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!).

Так что поэкспериментировать можно, но при этом нужно отдавать себе отчет в том, что полученные результаты справедливы только для определенного сочетания аппаратной архитектуры + ОС + компилятора, и могут резко измениться при изменении любого из них.
0
12.10.2012, 12:08
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
12.10.2012, 12:08
Привет! Вот еще темы с ответами:

Почему выводится в виде таблицы и почему не работает сортировка - C++
почему выводится в виде таблицы? почему не работает сортировка? и как туда можно вставить классы комнат? hotel.h #include...

Почему не считывает весь файл? - C++
Считывает только часть файла (приблизительно 29 строк любого тхт файла). Подскажите пожалуйста в чём может быть ошибка. Вот часть кода,...

Почему выводится ноль? - C++
Помогите вывести на экран значение , что я не делал , чем я не пытался оно дает 0.Не надо рассказывать про count , меня интересует именно ...

Почему вместо 2 выводится белеберда? - C++
// mamalclass.cpp: определяет точку входа для консольного приложения. // #include &quot;stdafx.h&quot; #include &lt;iostream&gt; #include...


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

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Опции темы

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