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

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

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

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

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

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

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

108
63 / 46 / 11
Регистрация: 27.12.2017
Сообщений: 1,484
19.02.2020, 09:50  [ТС]
DrOffset, и выведет он соответственно начальный адресс этого массива?

Добавлено через 1 минуту
Croessmah, в Foo уйдёт указатель int (*) [20]
0
19501 / 10106 / 2461
Регистрация: 30.01.2014
Сообщений: 17,822
19.02.2020, 09:50
Цитата Сообщение от ReYalp Посмотреть сообщение
Первого элемента в массиве?
Да.
То, что адрес самого массива и адрес первого элемента массива, и первого элемента первого подмассива совпадают численно - это всего лишь деталь реализации. Концептуально - это разные адреса, потому что все три - это разные объекты. И говорить о них надо как о разных адресах.
0
63 / 46 / 11
Регистрация: 27.12.2017
Сообщений: 1,484
19.02.2020, 09:53  [ТС]
DrOffset, вот эта та самая часть которая меня запутала, если вернутся к тому примеру с которого все началось int arr[10][20] cout<<arr и cout << &arr в первом случае выводится начальный адресс первого подмассива, а во втором всего массива, верно? Если это так то вроде как все прояснилось, спасибо
0
19501 / 10106 / 2461
Регистрация: 30.01.2014
Сообщений: 17,822
19.02.2020, 09:54
Цитата Сообщение от ReYalp Посмотреть сообщение
int arr[10][20] cout<<arr и cout << &arr в первом случае выводится начальный адресс первого подмассива, а во втором всего массива, верно? Если это так то вроде как все прояснилось, спасибо
Верно.
1
Mental handicap
 Аватар для Azazel-San
1246 / 624 / 171
Регистрация: 24.11.2015
Сообщений: 2,429
19.02.2020, 09:58
Цитата Сообщение от DrOffset
sizeof(arr[0]) - это sizeof(double[20]), а не sizeof(double(*)[20])
Мы же изначально говорили о arr + 1 )
Мне просто не стоило брать sizeof, ибо тогда получается размер указателя, но я неявно имел ввиду, что там должно было быть ещё разыменование до double[20]. Чтобы получился sizeof(arr[0]).

Ну и да, должно было быть sizeof(*parr)

Цитата Сообщение от DrOffset
То, что адрес самого массива и адрес первого элемента массива, и первого элемента первого подмассива совпадают численно - это всего лишь деталь реализации. Концептуально - это разные адреса, потому что все три - это разные объекты. И говорить о них надо как о разных адресах.
rat0r, тогда таки был прав что это UB)
0
19501 / 10106 / 2461
Регистрация: 30.01.2014
Сообщений: 17,822
19.02.2020, 11:15
Цитата Сообщение от Azazel-San Посмотреть сообщение
Мне просто не стоило брать sizeof, ибо тогда получается размер указателя, но я неявно имел ввиду, что там должно было быть ещё разыменование до double[20]. Чтобы получился sizeof(arr[0]).
Тут все проще, массив не преобразуется к указателю в том контексте. Поэтому разыменование не требуется.
0
92 / 65 / 27
Регистрация: 23.01.2020
Сообщений: 156
19.02.2020, 13:03
Правильно ли я все понял?
1. int arr [2][5] - это два массива по 5-ть элементов.
2. &arr - это адресс всего объекта (два массива по 5-ть элементов)
3. arr - адрес первого из 2-х массивов.
4. arr + 1 - адрес 2-го массива.
5. * arr - адрес 1-го элемента 1-го массива.
6. (*arr) + 1 - адрес 2-го элемента 1-го массива.
7. *(arr + 1) - адрес 1-го элемента 2-го массива.
8. *(* arr) - содержимое 1-го элемента 1-го массива.
9. *((* arr)+1) - содержимое 2-го элемента 1-го массива.
10.*(*(arr+1)) - содержимое 1-го элемента 2-го массива.
Какие пункты не верны?
0
19501 / 10106 / 2461
Регистрация: 30.01.2014
Сообщений: 17,822
19.02.2020, 13:18
3 - это не адрес, это сам объект. Участвуя в некоторых типах выражений, выражение arr может приводиться к указателю.
А вот
4 - это адрес, потому что результат сложения с единицей - это указатель. А выражение из №3 как раз поставлено в такой контекст, когда оно будет сконвертировано в указатель..
Про 5 и 6 все тоже самое, что описано выше про 3 и 4.

Остальное верно.
1
63 / 46 / 11
Регистрация: 27.12.2017
Сообщений: 1,484
19.02.2020, 13:29  [ТС]
DrOffset, вся проблема была в том что понять что массив может быть объектом слегка трудновато, если Вы приводили в качестве примера double, его можно передать в функцию по значению что с массив ом нельзя сделать (кстати это из-за того что копирование массивов не разрешается?), есть кстати какой-то толк от передачи массива по ссылке? Ередача по ссылке для массивов сделана для того чтобы передали конкретно массив, или чтобы размерность уточнить?
0
19501 / 10106 / 2461
Регистрация: 30.01.2014
Сообщений: 17,822
19.02.2020, 13:47
Цитата Сообщение от ReYalp Посмотреть сообщение
(кстати это из-за того что копирование массивов не разрешается?)
Да, это особенность унаследованная из Си.

Цитата Сообщение от ReYalp Посмотреть сообщение
есть кстати какой-то толк от передачи массива по ссылке?
Есть конечно. Как и любого другого объекта в подобных случаях. Ссылка предоставляет семантику значения: если нужно значение без копирования, то используем ссылку.
0
63 / 46 / 11
Регистрация: 27.12.2017
Сообщений: 1,484
19.02.2020, 13:49  [ТС]
DrOffset, Тоесть если я передам массив по ссылке то я смогу спокойно его размер найти и вообще это будет тот же массив?
0
19501 / 10106 / 2461
Регистрация: 30.01.2014
Сообщений: 17,822
19.02.2020, 13:50
ReYalp, да
1
зомбяк
 Аватар для TRam_
1585 / 1219 / 345
Регистрация: 14.05.2017
Сообщений: 3,940
19.02.2020, 14:10
ReYalp, но не забывай, что либо придётся на каждый размер массива делать свою функцию обработки, либо шаблоном нагенерировать параметризации на все используемые размеры.
1
19501 / 10106 / 2461
Регистрация: 30.01.2014
Сообщений: 17,822
19.02.2020, 14:16
Пример использования: https://en.cppreference.com/w/cpp/iterator/end
1
248 / 70 / 9
Регистрация: 22.07.2018
Сообщений: 321
19.02.2020, 18:33
Цитата Сообщение от DrOffset Посмотреть сообщение
То, что адрес самого массива и адрес первого элемента массива, и первого элемента первого подмассива совпадают численно - это всего лишь деталь реализации. Концептуально - это разные адреса, потому что все три - это разные объекты. И говорить о них надо как о разных адресах.
А то, что сравнение на равенство указателя на массив с указателем на его первый элемент или указателя на standard-layout struct с указателем на первый мембер этой структуры даёт true — это тоже деталь реализации?
0
зомбяк
 Аватар для TRam_
1585 / 1219 / 345
Регистрация: 14.05.2017
Сообщений: 3,940
19.02.2020, 18:34
argcargv, да. Причём такое бывает не для любых структур. Если объявишь в структуре виртуальную функцию - адреса уже будут различаться.
0
901 / 478 / 93
Регистрация: 10.06.2014
Сообщений: 2,700
19.02.2020, 18:58
Цитата Сообщение от argcargv Посмотреть сообщение
А то, что сравнение на равенство указателя на массив с указателем на его первый элемент
Цитата Сообщение от argcargv Посмотреть сообщение
даёт true
почему true? их вроде как нельзя сравнивать
C++
1
2
3
4
5
6
7
8
9
#include <iostream>
 
int main()
{
    int arr[] = {1,2,3};
    int *p = arr; // указатель на первый элемент массива
    int (*aP)[3] = &arr; // указатель на массив
    std::cout << (p == aP); // ошибка компиляции
}
Добавлено через 18 минут
Цитата Сообщение от argcargv Посмотреть сообщение
ли указателя на standard-layout struct с указателем на первый мембер этой структуры даёт true
аналогично несравнимые
C++
1
2
3
4
5
6
7
8
9
10
11
12
struct sls
{
    int a;
    int b;
};
 
int main()
{
    sls *p1 = new sls;
    int *p2 = &p1->a;
    std::cout << (p1 == p2);
}
т.е адреса может и одинаковые, но с точки зрения типов это несравнимые вещи
0
63 / 46 / 11
Регистрация: 27.12.2017
Сообщений: 1,484
19.02.2020, 19:17  [ТС]
Undisputed, он наверное имеет ввиду что-то такое (void*) &arr == (void*) arr
0
19.02.2020, 19:25

Не по теме:

ReYalp,
Он написал указатель на массив и указатель на первый элемент массива.
Это вполне конкретные понятия.

0
248 / 70 / 9
Регистрация: 22.07.2018
Сообщений: 321
19.02.2020, 20:19
Цитата Сообщение от Undisputed Посмотреть сообщение
Это вполне конкретные понятия.
И от каста к void* указатель на массив не перестаёт быть указателем на массив. Вполне канкретно в стандарте написано.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
19.02.2020, 20:19

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

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
100
Ответ Создать тему
Новые блоги и статьи
[golang] Конкурентный fetcher с ограничением максимального количества одновременных HTTP запросов.
alhaos 10.06.2026
Задача Реализовать конкурентный fetcher с ограничением максимального количества одновременных HTTP запросов. Сигнатура func Fetch(urls string, maxConcurrent int) Result Пример urls :=. . .
[golang] Состояние гонки (race condition)
alhaos 10.06.2026
Состояние гонки (race condition) Состояние гонки (Race Condition) — это ошибка, возникающая при одновременном доступе нескольких горутин к одним и тем же данным без должной синхронизации. При этом. . .
Взрослые отношения, и почему они не получаются
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. Казалось бы, задача на пять минут. Заняла полтора часа. Делюсь опытом — может кому пригодится последовательность решений. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru