Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.70/27: Рейтинг темы: голосов - 27, средняя оценка - 4.70
1 / 1 / 0
Регистрация: 07.04.2016
Сообщений: 40

Как объявить указатель на массив?

13.07.2016, 12:34. Показов 5888. Ответов 19
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Читаю книгу С.Прата, наткнулся на это:
C++
1
short (*pas) [20] = &tell; // pas указывает на массив из 20 элементов short
Если опустить круглые скобки, то правила приоритетов будут ассоциировать [20] в первую очередь с pas, делая pas массивом из 20 указателей на short, поэтому круглые скобки необходимы. Далее, если вы хотите описать тип переменной, вы можете воспользоваться объявлением этой переменной в качестве руководства и удалить имя переменной. Таким образом, типом pas является short (*) [20]. Кроме того, обратите внимание, что поскольку значение pas установлено в &teii, *pas эквивалентно tell, и (*pas) [0] будет первым элементом массива tell.
Я не понимаю, что значит "Если вы хотите описать тип переменной, вы можете воспользоваться объявлением этой переменной в качестве руководства и удалить имя переменной. Таким образом, типом pas является short (*) [20]".
Где описать тип переменной и какой? Я что-то туплю, не понимаю, о чём говорит автор.
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
13.07.2016, 12:34
Ответы с готовыми решениями:

Как объявить указатель на массив через typedef и как инициализировать такой тип
Как заставить заработать этот фрагмент кода? INT_L -- указатель на массив из 100 элементов типа char; Не получается в переменную C...

Объявить массив объектов класса Point - не работает указатель
всем привет подскажите пожалуйста что я сделал не так ? //Объявить массив объектов класса Point, //каждый из которых представляет...

Объявить массив? Запросто! Объявить массив массивов? А как это?
Доброго времени суток! Конечно, все знают, как объявить массив! int main () { int array; }

19
Неэпический
 Аватар для Croessmah
18146 / 10730 / 2066
Регистрация: 27.09.2012
Сообщений: 27,029
Записей в блоге: 1
13.07.2016, 12:40
Цитата Сообщение от csgorulit Посмотреть сообщение
Если вы хотите описать тип переменной, вы можете воспользоваться
объявлением этой переменной в качестве руководства и удалить имя переменной.
Ну так написано же:
типом pas является short (*) [20]
0
1394 / 1023 / 325
Регистрация: 28.07.2012
Сообщений: 2,813
13.07.2016, 12:40
Цитата Сообщение от csgorulit Посмотреть сообщение
Где описать тип переменной и какой?
C++
1
using T = short(*)[20];
Тогда переменную pas можно объявить как
C++
1
T pas;
0
Заблокирован
13.07.2016, 12:40
Цитата Сообщение от csgorulit Посмотреть сообщение
short (*pas) [20]
- это объявление переменно с именем pas. У переменной pas есть тип. Этот тип - short (*) [20].

Например, я захотел в функцию передать указатель на массив из 20 short. Мне нужно в описании функции указать тип аргумента. Автор говорит, что для указания типа "указатель на массив из 20 short", я могу воспользоваться в качестве базы объявлением переменной, но удалить имя. Получу тип аргумента - short (*) [20].
0
JOE_MING
13.07.2016, 12:40
Цитата Сообщение от csgorulit Посмотреть сообщение
Читаю книгу С.Прата
какую именно?
1 / 1 / 0
Регистрация: 07.04.2016
Сообщений: 40
13.07.2016, 12:59  [ТС]
"Язык программирования С++. Лекции и упражнения" 2011

Добавлено через 9 минут
Мда... Про подобное автор не упоминал до этих строк. Слегка вводит в тупик незнающих.
0
Неэпический
 Аватар для Croessmah
18146 / 10730 / 2066
Регистрация: 27.09.2012
Сообщений: 27,029
Записей в блоге: 1
13.07.2016, 13:09
Цитата Сообщение от csgorulit Посмотреть сообщение
Про подобное автор не упоминал до этих строк.
Да ну прям
C++
1
int pas;
какой тип имеет pas? Правильно, int.
C++
1
short (*pas) [20];
какой тип имеет pas?
Цитата Сообщение от csgorulit Посмотреть сообщение
"Если вы хотите описать тип переменной, вы можете воспользоваться объявлением этой переменной в качестве руководства и удалить имя переменной. Таким образом, типом pas является short (*) [20]"
т.е. следуя фразе, убираем имя переменой и получаем её тип.
Значит тип pas - short (*) [20]
0
 Аватар для shilko2013
257 / 234 / 185
Регистрация: 02.04.2016
Сообщений: 898
13.07.2016, 13:55
Цитата Сообщение от csgorulit Посмотреть сообщение
Как объявить указатель на массив?
Указатель на массив равен указателю на первый элемент массива.
C++
1
2
3
4
5
6
int a[10];
int *p1,*p2;
p1 = a;
p2 = &a[0];
if (p1 == p2)
   cout << "Так точно!";
И p1 и p2 - это указатель на массив.
0
1 / 1 / 0
Регистрация: 07.04.2016
Сообщений: 40
13.07.2016, 13:59  [ТС]
Скажите пожалуйста, а почему эти два оператора выдают один результат?
C++
1
2
cout << *pas << endl;
cout << pas << endl;
Почему в первом случае выдаётся всё равно адрес, а не значение?
0
👻👻👻
 Аватар для daniilorain
21 / 28 / 12
Регистрация: 22.04.2016
Сообщений: 166
13.07.2016, 14:08
В первом случае может выдаться адрес, если pas -- указатель на указатели, тогда для разыменования вам нужно использовать две звездочки: **pas
0
Неэпический
 Аватар для Croessmah
18146 / 10730 / 2066
Регистрация: 27.09.2012
Сообщений: 27,029
Записей в блоге: 1
13.07.2016, 14:10
Цитата Сообщение от csgorulit Посмотреть сообщение
Почему в первом случае выдаётся всё равно адрес, а не значение?
pas - это указатель с адресом массива.
*pas - это уже сам массив.
При выводе pas Вы выводите значение, которое содержится в указателе - адрес массива.
При выводе *pas Вы "получаете сам массив" и выводите адрес массива.

P.S. Тип массива неявно ослабляется до типа указателя.
1
 Аватар для shilko2013
257 / 234 / 185
Регистрация: 02.04.2016
Сообщений: 898
13.07.2016, 14:24
Здесь выводится адрес и значение 0 элемента.
C++
1
2
3
4
5
6
7
8
    int c[10];
    int *p1, *p2;
    p1 = c;
    p2 = &c[0];
    if (p1 == p2)
        cout << "Так точно!";
    cout << p1 << endl;
    cout << *p1;
0
JOE_MING
13.07.2016, 15:22
Цитата Сообщение от csgorulit Посмотреть сообщение
Мда... Про подобное автор не упоминал до этих строк. Слегка вводит в тупик незнающих.
я пока начал с Г.Шилдта...
 Аватар для shilko2013
257 / 234 / 185
Регистрация: 02.04.2016
Сообщений: 898
13.07.2016, 15:25
JOE_MING, Я тоже Шилдта читаю, его справочник лучше любого учебника)
0
JOE_MING
13.07.2016, 15:37
Цитата Сообщение от shilko2013 Посмотреть сообщение
его справочник лучше любого учебника)
у тебя какого года издания? свежие?
 Аватар для shilko2013
257 / 234 / 185
Регистрация: 02.04.2016
Сообщений: 898
13.07.2016, 15:39
JOE_MING, 4 издание 2006г
0
15 / 15 / 8
Регистрация: 15.08.2013
Сообщений: 190
13.07.2016, 15:50
shilko2013, По счет справочника я полностью согласен)
0
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
13.07.2016, 15:56
Цитата Сообщение от shilko2013 Посмотреть сообщение
И p1 и p2 - это указатель на массив.
оба они являются указателями на int,
и не являются указателями на массив.
0
13.07.2016, 16:44

Не по теме:

hoggy, с возвращением :friends:
В силу множества подобных вопросов, пишу сейчас статейку.
Правда, готова будет не скоро :D
Материала слишком много.

0
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
13.07.2016, 16:47
Цитата Сообщение от Croessmah Посмотреть сообщение
с возвращением
мерси
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
13.07.2016, 16:47
Помогаю со студенческими работами здесь

Классы. Объявить массив динамически и сделать указатель на объект в динамической памяти
Я создал классы: ПЕРСОНА, служащий, роботодатель, инженер. Но мне нужно в программе (после int main() 69 строка) объявить массив...

Не знаю как объявить указатель!
Нужно ввести указатель ptr, чтобы он изначально указывал на голову двусвязного списка. Не знаю как это сделать, постоянно ошибками сыплет. ...

Как объявить указатель на классы наследники одного класса?
Требуется в одном классе(напримпр, NLayer) объявить, а потом и заполнить динамический массив из объектов-наследников (например, LogNeuron,...

Как глобально объявить указатель структуры, и переменные хранящиеся в ней?
Как глобально объявить указатель структуры, и переменные хранящиеся в ней? Вот указатель вроде объявил, но всё же есть ошибки. #include...

Объявить в классе-наследнике указатель, указывающий туда же, куда указывает указатель в классе-родителе
Здравствуйте. Имеется базовый класс MainWindow: #ifndef MAINWINDOW_H #define MAINWINDOW_H #include &quot;globaltime.h&quot; class...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
SDL3 для Android: Загрузка PNG с альфа-каналом с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru