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

Что такое указатель на массив?

18.02.2020, 15:28. Показов 6628. Ответов 108
Метки нет (Все метки)

Указатель на массив это указатель на первый элемент массива?
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
18.02.2020, 15:28
Ответы с готовыми решениями:

Что такое хэндлер файла? Что такое файловый указатель?
Что такое хэндлер файла? Что такое файловый указатель?

Что такое указатель на абстрактный класс?
В задании сказано - Методы класса должны принимать указатель на абстрактный класс , что это значит и как это реализовывается?

Что такое указатель на член класса?
Что такое указатель на член класса?

108
19501 / 10106 / 2461
Регистрация: 30.01.2014
Сообщений: 17,822
18.02.2020, 22:17
ReYalp, считайте для простоты, что скобки задают приоритет того, как интерпретировать запись. Если звездочка в скобках, то она относится ко всему тому, что снаружи этих скобок.
C++
1
int (*p)[10];
* - применяется к int[10] - т.е. вместе это указатель на массив - если скобки убрать - будет массив указателей.
C++
1
int (*foo())[10]
* - применяется к int[10] - указатель на массив
C++
1
int (*pf)(int, int, double);
* - применяется к int(int, int, double) - это тип функции, вместе это получается указатель на функцию.
1
63 / 46 / 11
Регистрация: 27.12.2017
Сообщений: 1,484
18.02.2020, 22:48  [ТС]
DrOffset, а зачем вообще придумали указатели на массивы если есть указатели на его первый элемент? ведь по сути это же абсолютно одинаковые указатели( кроме случаев если указатель на первый элемент массива сдвинули). Если создать указатели и сразу инициализировать его
C++
1
2
int num[10]{};
    int (*pn) [10]  = #
то получится что pn = &num[0] , но зачем лишний синтаксис для этих указателей если можно просто использовать num а не создавать pn?
0
19501 / 10106 / 2461
Регистрация: 30.01.2014
Сообщений: 17,822
18.02.2020, 22:58
ReYalp, вы должны внимательно прочитать то, что уже было написано ранее. Мы это уже обсуждали.
0
63 / 46 / 11
Регистрация: 27.12.2017
Сообщений: 1,484
18.02.2020, 23:00  [ТС]
DrOffset, но мы же обсуждали [] с размером, а не мотивы создания указателей
0
19501 / 10106 / 2461
Регистрация: 30.01.2014
Сообщений: 17,822
18.02.2020, 23:16
ReYalp,
Цитата Сообщение от DrOffset Посмотреть сообщение
указатель может указывать на любой объектный тип. Массив - тоже объектный тип.
...

Ключевое слово любой.
Т.е. нет никакого специального лишнего синтаксиса, синтаксис один для любых объектов.

Добавлено через 1 минуту
У объекта можно взять адрес. И тип указателя должен отражать тип указуемого объекта.
Если объект у нас - массив, значит тип этого массива должен быть частью типа указателя. Это общее правило.

Добавлено через 4 минуты
Также есть ситуации, когда вы не сможете обойтись без указателей на массивы, иначе не получится обеспечить корректную арифметику адресов.
Возьмем двумерный массив.
C++
1
int a[10][20]
Какой тип первого элемента "внешнего" массива?
К типу какого указателя приводится выражение a неявно?

Как используя арифметику указателей, перейти от первого элемента ко второму? Почему в типе указателя должна содержаться информация о типе указуемого объекта, чтобы арифметика указателей работала?

Ответите на эти вопросы, ваши отпадут сами.
1
63 / 46 / 11
Регистрация: 27.12.2017
Сообщений: 1,484
18.02.2020, 23:41  [ТС]
DrOffset,
Цитата Сообщение от DrOffset Посмотреть сообщение
Какой тип первого элемента "внешнего" массива?
указатель на массив 20 элементов типа int?
Цитата Сообщение от DrOffset Посмотреть сообщение
К типу какого указателя приводится выражение a неявно?
к типу указателя на массив int
Цитата Сообщение от DrOffset Посмотреть сообщение
Как используя арифметику указателей, перейти от первого элемента ко второму?
++a?
Цитата Сообщение от DrOffset Посмотреть сообщение
Почему в типе указателя должна содержаться информация о типе указуемого объекта, чтобы арифметика указателей работала?
ну очевидно чтобы при смещении это делалось на определенный отрезок байт
0
19501 / 10106 / 2461
Регистрация: 30.01.2014
Сообщений: 17,822
18.02.2020, 23:47
Цитата Сообщение от ReYalp Посмотреть сообщение
указатель на массив 20 элементов типа int?
Нет. Тип элемента - массив из 10 int. Итого у нас в массиве а - 20 массивов из 10 int.

Цитата Сообщение от ReYalp Посмотреть сообщение
к типу указателя на int
Нет. К типу указатель на массив из 10 int. Коль у нас элементы массива - это другие массивы.

Цитата Сообщение от ReYalp Посмотреть сообщение
++a?
a + 1

Цитата Сообщение от ReYalp Посмотреть сообщение
ну очевидно чтобы при увеличениии или убавлении это делалось на определенный отрезок байт
Да. С учетом вышесказанного теперь все соедините вместе.
0
63 / 46 / 11
Регистрация: 27.12.2017
Сообщений: 1,484
18.02.2020, 23:52  [ТС]
DrOffset, DrOffset, чёт я не понял, a[10][20] это 10 массивов из 20 объектов или наоборот?
0
19501 / 10106 / 2461
Регистрация: 30.01.2014
Сообщений: 17,822
18.02.2020, 23:57
Цитата Сообщение от ReYalp Посмотреть сообщение
a[10][20] это 10 массивов из 20 объектов или наоборот?
Да, массив из 10 массивов из 20 int.
Писал с своего примера, а потом когда вспомнил\увидел, что до этого давал пример наоборот, уже не успел исправить.

Добавлено через 1 минуту
Т.е.
Цитата Сообщение от DrOffset Посмотреть сообщение
Тип элемента - массив из 10 int. Итого у нас в массиве а - 20 массивов из 10 int.
Следует читать как
Тип элемента - массив из 20 int. Итого у нас в массиве а - 10 массивов из 20 int.
и
Цитата Сообщение от DrOffset Посмотреть сообщение
К типу указатель на массив из 10 int. Коль у нас элементы массива - это другие массивы.
как
К типу указатель на массив из 20 int. Коль у нас элементы массива - это другие массивы.
0
63 / 46 / 11
Регистрация: 27.12.2017
Сообщений: 1,484
18.02.2020, 23:57  [ТС]
DrOffset, Тоесть я все верно описал выше?
0
19501 / 10106 / 2461
Регистрация: 30.01.2014
Сообщений: 17,822
18.02.2020, 23:58
Цитата Сообщение от ReYalp Посмотреть сообщение
Тоесть я все верно описал выше?
Нет, не верно.
Кроме перепутанных размерностей все остальное в силе.
0
63 / 46 / 11
Регистрация: 27.12.2017
Сообщений: 1,484
19.02.2020, 00:06  [ТС]
DrOffset, но я все же правильно описал кроме первого, насчёт указателя на int - я исправил на массив int, с самого начала имел это ввиду, а вот первое не совсем понятно, как может быть сам массив, а не указатель на него либо первый элемент?
0
19501 / 10106 / 2461
Регистрация: 30.01.2014
Сообщений: 17,822
19.02.2020, 00:20
Цитата Сообщение от ReYalp Посмотреть сообщение
как может быть сам массив, а не указатель на него либо первый элемент?
Массив - объектный тип.
double, например, тоже объектный тип. Вы же можете сделать массив из double`ов?
Значит и массив из других массивов сможете. Чем он хуже?
Вопрос лишь в том, насколько сдвигать указатель.

Замените конкретный тип на T.
Запишите
C++
1
T arr[10];
Не смущает же ничем эта запись?
Можете теперь перед ним объявить T как typedef double.
C++
1
2
3
using T = double;
 
T arr[10];
Все нормально пока, нет никакого неожиданного поведения? Тип элемента такого массива - T?
Теперь возьмите и поменяйте T на double[20];
C++
1
2
3
using T = double[20];
 
T arr[10];
Ничего же принципиально не изменилось? Тип элемента все еще T.
T - это что теперь? Массив же, правда ведь?
0
63 / 46 / 11
Регистрация: 27.12.2017
Сообщений: 1,484
19.02.2020, 00:27  [ТС]
DrOffset, ну да, выходит что если есть int arr[10][20] то первый элемент внешнего (arr[0] это первый массив из 20), согласен, но каким образом я должен был понять зачем нам нужны указатели на массивы? )
0
19501 / 10106 / 2461
Регистрация: 30.01.2014
Сообщений: 17,822
19.02.2020, 00:32
Цитата Сообщение от ReYalp Посмотреть сообщение
но каким образом я должен был понять зачем нам нужны указатели на массивы?
Ну подумайте.
Вот у нас есть пример выше.
C++
1
2
3
using T = double[20];
 
T arr[10];
И мы хотим получить указатель на второй элемент массива.
Что мы делаем?
C++
1
auto p = arr + 1;
Верно?
Какой тип у p?
На сколько байт двигает операция + 1 адрес?
0
63 / 46 / 11
Регистрация: 27.12.2017
Сообщений: 1,484
19.02.2020, 00:34  [ТС]
DrOffset, у р тип указатель на массив типа double , операция ++ двигает на количество байт равное szieof(double) * количество элементов массива на который указатель указывает
0
19501 / 10106 / 2461
Регистрация: 30.01.2014
Сообщений: 17,822
19.02.2020, 00:44
ReYalp, ну вот.
Операция индексации всегда содержит адресную арифметику, потому что
C++
1
arr[1] // *(arr + 1)
таким образом, если вы просто используете индексацию в двумерном массиве, то вы всегда имеете дело с указателями на массив.
C++
1
arr[1][2] // *(*(arr + 1) + 2)
где
arr + 1 даст double(*)[20]
*(arr + 1) даст double[20]
*(arr + 1) + 2 даст double *
*(*(arr + 1) + 2) даст double,
2
63 / 46 / 11
Регистрация: 27.12.2017
Сообщений: 1,484
19.02.2020, 00:50  [ТС]
DrOffset, кстати в книге Липпмана сказано что массивов двумерный не существует в С++, есть только массивы массивов
0
Mental handicap
 Аватар для Azazel-San
1246 / 624 / 171
Регистрация: 24.11.2015
Сообщений: 2,429
19.02.2020, 00:50
Цитата Сообщение от ReYalp Посмотреть сообщение
szieof(double) *
Должно быть sizeof(double(*)[20]), вроде
0
19501 / 10106 / 2461
Регистрация: 30.01.2014
Сообщений: 17,822
19.02.2020, 00:52
Цитата Сообщение от ReYalp Посмотреть сообщение
кстати в книге Липпмана сказано что массивов двумерный не существует в С++, есть только массивы массивов
Ну в Си и Си++ двумерные (любые многомерные) массивы эмулируются через массивы массивов.

Добавлено через 1 минуту
Цитата Сообщение от Azazel-San Посмотреть сообщение
Должно быть sizeof(double(*)[20]), вроде
Не, я спросил на сколько байт нужно сдвинуть указатель, что перейти ко второму элементу.
Этот размер в данном случае - это sizeof(double[20]) или, как сказал, ТС - sizeof(double) * 20
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
19.02.2020, 00:52

Указатель на ссылку или что это такое?
void add(char aData, Branch *&aBranch); Речь об аргументе aBranch. Как это понимать? Указатель на ссылку? Не понятно. Вроде такое не...

Что такое указатель и с чем его есть
Я уже не знаю что делать, но в книжке очень непонятно написано про указатели. Не могли бы вы объяснить что такое указатели и зачем они. И...

Что такое указатель на массив и как им пользоваться?
Всем привет! Нужна информация по сабжу, как объявлять, и что вообще представляет собой(указатель на первый элемент массива, а может на...

Что такое указатель?
Указатель - это переменная, которая в хранит качестве своего значения адрес байта памяти. Что значит адрес байта памяти? К примеру...

Что быстрее использовать, массив э-в, или указатель на массив э-в?
уважаемые, что быстрее использовать, массив э-в, или указатель на массив э-в? или без разницы? С одной стороны обращается все к той же...


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

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
Новые блоги и статьи
Взрослые отношения, и почему они не получаются
kumehtar 09.06.2026
Когда в детстве ребёнок не получает от родителей чего-то важного, он лишается не просто приятных переживаний, а основы для формирования определённых внутренних качеств и навыков. Если ребёнок не. . .
[golang] Worker Pool
alhaos 09.06.2026
Worker Pool Worker Pool — паттерн конкурентной обработки задач в Go. Суть: фиксированное количество горутин-воркеров читают задачи из общего канала и пишут результаты в общий канал результатов. . . .
[golang] Pipeline
alhaos 08.06.2026
Pipeline Pipeline — паттерн конкурентной обработки данных в Go. Суть: данные проходят через цепочку независимых стадий, каждая из которых работает в своей горутине и общается с соседями через. . .
Свет внутри себя
kumehtar 07.06.2026
Пусть это будет здесь lIs4oanZS9Y
Программа для com-порта
Uhbif79 05.06.2026
Всем привет, давно хотел изучить Qt, начинал, бросал, потом снова начинал. И сейчас вот смог написать свою первую программу. До этого имел опыт программирования микроконтроллеров, писал прошивки на. . .
Транскрипция 55-минутного видео через Whisper: WhisperDesktop облажался, спас Google Colab[
anaschu 01.06.2026
Понадобилось получить текст из свежезагруженного видео на YouTube. Казалось бы, задача на пять минут. Заняла полтора часа. Делюсь опытом — может кому пригодится последовательность решений. . . .
21 мат мед. Планы на развитие модели здравоСохранения
anaschu 01.06.2026
AnyLogic: план развития симуляционной модели рабочего коллектива — динамический абсентеизм, реальные данные, три сценария сравнения Продолжаю серию постов о дискретно-событийной модели рабочего. . .
20. Мат мед. Абсентеизм как отдельный тип простоя
anaschu 29.05.2026
Апдейт модели: исправленные баги, абсентеизм и новые механизмы Продолжаю развивать ранее описанную модель рабочего коллектива на AnyLogic. За последние несколько дней был проведён серьёзный. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru