Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.80/5: Рейтинг темы: голосов - 5, средняя оценка - 4.80
2 / 2 / 2
Регистрация: 26.03.2016
Сообщений: 50
1

Как из указателя получтлся массив?

03.07.2016, 18:10. Показов 1000. Ответов 6

Возможно глупый вопрос,но как unsigned char *e превратился в массив?
C++
1
2
3
4
5
6
7
8
9
10
11
12
int add(CStash* s ,const void* element){
if(s->next >= s->quantity)
inflate(s,increment);
 
int startBytes = s->next * s ->size; 
unsigned char* e =(unsigned char*)element;
for(int i =0;i < s->size;i++)
s->storage[startBytes+i]=e[i];
s->next++;
return(s->next-1);
 
}
__________________
Помощь в написании контрольных, курсовых и дипломных работ здесь
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
03.07.2016, 18:10
Ответы с готовыми решениями:

Как узнать размерность указателя на массив
Такой вопрос, создаю динамический массив, но т.к. это указатель, то при запросе размерности...

Как передавать в функцию указатели на двумерный массив и как с помощью указателя двигаться по массиву?
Добрый день, уважаемые знатоки С++! Я долгое время работал в С#, но недавно перешел на С++, и у...

Как сделать функцию от указателя на класс и указателя на метод?
Не получается сделать функцию, параметрами которой являются указатель на класс и на метод....

Как из указателя на массив достать конкретное значение массива
Добрый день. Недавно написал программу проверки предложения на панграмму. Панграмма — текст,...

6
Модератор
Эксперт С++
11483 / 9400 / 5650
Регистрация: 18.12.2011
Сообщений: 25,114
03.07.2016, 18:18 2
Ему присвоили адрес массива element.
а e[i] это то же самое, что и *(e+i)
Кстати i[e] - это тоже *(e+i)
1
690 / 99 / 17
Регистрация: 22.06.2014
Сообщений: 213
03.07.2016, 18:19 3
Следует почитать на тему того, что такое: 1) имя массива 2) указатель на элементы массива 3) арифметика указателей.
Перед поисками сразу проспойлерю, что "e" у вас и не превращалось в массив, оно является указателем на элемент массива, и этот указатель можно использовать для обхода по массиву, используя квадратные скобки.
1
2 / 2 / 2
Регистрация: 26.03.2016
Сообщений: 50
03.07.2016, 18:28  [ТС] 4
Цитата Сообщение от zss Посмотреть сообщение
Ему присвоили адрес массива element.
А почему element массив?Он же просто содержит адрес какого-либо элемента(например int).
0
2733 / 1892 / 564
Регистрация: 05.06.2014
Сообщений: 5,526
03.07.2016, 18:42 5
Цитата Сообщение от Xristos Посмотреть сообщение
Возможно глупый вопрос,но как unsigned char *e превратился в массив?
Потому что указатель можно использовать и как указатель на один элемент, и как указатель на массив неизвестной длины. С риском получить граблями по лбу, если это все же был один элемент, а не массив.

Добавлено через 2 минуты
Цитата Сообщение от Xristos Посмотреть сообщение
А почему element массив?
По древнему договору скрепленному кровью дракона.
На самом деле, никаких гарантий что в element именно массив нет, void* может указывать на что угодно, главное, чтоб не константное. Впрочем, при особо наглых преобразованиях можно туда и константное запихать.
2
2 / 2 / 2
Регистрация: 26.03.2016
Сообщений: 50
03.07.2016, 18:53  [ТС] 6
Цитата Сообщение от Renji Посмотреть сообщение
Потому что указатель можно использовать и как указатель на один элемент, и как указатель на массив неизвестной длины. С риском получить граблями по лбу, если это все же был один элемент, а не массив.

Добавлено через 2 минуты

По древнему договору скрепленному кровью дракона.
На самом деле, никаких гарантий что в element именно массив нет, void* может указывать на что угодно, главное, чтоб не константное. Впрочем, при особо наглых преобразованиях можно туда и константное запихать.
Т.е если запихать в void* int а потом привести к типу int , то создаётся массив из за того что const char* не способен полностью вместить в себя int(т.к int=4 байт,char=1 байт).Я правильно понял?
0
2733 / 1892 / 564
Регистрация: 05.06.2014
Сообщений: 5,526
03.07.2016, 19:02 7
Лучший ответ Сообщение было отмечено Xristos как решение

Решение

Цитата Сообщение от Xristos Посмотреть сообщение
Т.е если запихать в void* int а потом привести к типу int , то создаётся массив из за того что const char* не способен полностью вместить в себя int(т.к int=4 байт,char=1 байт).Я правильно понял?
Не совсем так. "Массив" в данном случае - последовательность элементов расположенных в памяти строго друг за другом. Так как int является последовательностью из четырех байт, его можно использовать как массив из четырех char. Но, разумеется, при преобразовании int* к char* ничего, нигде не создается. Вы просто по-другому трактуете кусок памяти на который указывает указатель. На том же построено и использование указателя на один элемент как указателя на массив. Какие-то данные следом за элементом есть. вот они за содержимое "массива" и считаются.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
03.07.2016, 19:02

Передача указателя на массив
есть arr обьявлен и инициализирован требуется обьявить функцию передать в функцию указатель на...

Проверка указателя на массив
Как нам проверить, что указатель указывает на пямять, выделенную в куче, а не на стеке? например...

Преобразование указателя в массив
Всем привет. Есть указатель с типом const u_char * , известно , что он указывает на N байт. Как...

Преобразование указателя на C-массив
Добрый день. Есть функции:template&lt;int N&gt; constexpr void test1(const char (&amp;string)) { //...


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2022, CyberForum.ru