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

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

18.02.2020, 15:28. Показов 6653. Ответов 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, 01:04  [ТС]
Azazel-San, так нету разAzazel-San, так такой код выдаст в любом случае 8(на х64) тк размер указателя же статический
0
Mental handicap
 Аватар для Azazel-San
1246 / 624 / 171
Регистрация: 24.11.2015
Сообщений: 2,429
19.02.2020, 01:06
Цитата Сообщение от DrOffset Посмотреть сообщение
Этот размер в данном случае - это sizeof(double[20]) или, как сказал, ТС - sizeof(double) * 20
20 там не было?
sizeof(arr) = 20 * 10 * sizeof(double)
sizeof(arr[0]) = 20 * sizeof(double)
arr + 1 == &arr[1], тогда arr[1] == arr[0] + sizeof(arr[0])
0
63 / 46 / 11
Регистрация: 27.12.2017
Сообщений: 1,484
19.02.2020, 01:13  [ТС]
Azazel-San, было количество элементов подмассива те 20,а к чему все записи выше? То что Вы написали в прошлом ответе и здесь это разные вещи
0
Mental handicap
 Аватар для Azazel-San
1246 / 624 / 171
Регистрация: 24.11.2015
Сообщений: 2,429
19.02.2020, 01:19
Цитата Сообщение от ReYalp Посмотреть сообщение
То что Вы написали в прошлом ответе и здесь это разные вещи
Вы написали
Цитата Сообщение от ReYalp Посмотреть сообщение
операция ++ двигает на количество байт равное szieof(double) *
И это одни и те же вещи.

Добавлено через 30 секунд
Цитата Сообщение от ReYalp Посмотреть сообщение
те 20
А 20 видимо забыли.
0
63 / 46 / 11
Регистрация: 27.12.2017
Сообщений: 1,484
19.02.2020, 01:27  [ТС]
Azazel-San, Вы писали в первом ответе sizeof double (*) - это размер указателя, те 8 байт, без разницы на что он указывает, он всегда 8 байт будет в 64 битной архитектуре
0
Mental handicap
 Аватар для Azazel-San
1246 / 624 / 171
Регистрация: 24.11.2015
Сообщений: 2,429
19.02.2020, 01:29
Цитата Сообщение от ReYalp Посмотреть сообщение
Вы писали в первом ответе sizeof double (*) - это размер указателя, те 8 байт, без разницы на что он указывает, он всегда 8 байт будет в 64 битной архитектуре
Нет, я имел в виду не размер указателя, а sizeof(arr[0]) в смысле как sizeof(double(*)[20]):
C++
1
2
double (*parr)[20] = arr;
sizeof(arr[0]) == sizeof(parr) == (sizeof(double) * 20)
0
63 / 46 / 11
Регистрация: 27.12.2017
Сообщений: 1,484
19.02.2020, 01:33  [ТС]
Azazel-San, тогда ладно)
0
19501 / 10106 / 2461
Регистрация: 30.01.2014
Сообщений: 17,825
19.02.2020, 07:46
Цитата Сообщение от Azazel-San Посмотреть сообщение
sizeof(arr[0]) в смысле как sizeof(double(*)[20]):
sizeof(arr[0]) - это sizeof(double[20]), а не sizeof(double(*)[20])

Цитата Сообщение от Azazel-San Посмотреть сообщение
sizeof(parr)
Никак не может быть равен sizeof(arr[0]).

Добавлено через 1 минуту
Цитата Сообщение от Azazel-San Посмотреть сообщение
20 там не было?
В явном виде не было, но он написал же:
Цитата Сообщение от ReYalp Посмотреть сообщение
szieof(double) * количество элементов массива
* - это в данном случае умножение.
0
63 / 46 / 11
Регистрация: 27.12.2017
Сообщений: 1,484
19.02.2020, 08:02  [ТС]
DrOffset, почему адресс указателя и указатель имеют одинаковый адресс?
C++
1
2
3
4
5
6
7
8
9
 #include <iostream>
 
 
int main(int argc, char *argv[])
{
    int arr[10][20];
    std::cout<<&arr<< std::endl;
    std::cout<<arr ;
}
0
19501 / 10106 / 2461
Регистрация: 30.01.2014
Сообщений: 17,825
19.02.2020, 08:17
Цитата Сообщение от ReYalp Посмотреть сообщение
почему адресс указателя и указатель имеют одинаковый адресс?
Где вы тут видите адрес указателя? )
У вас есть адрес объекта массива в первой строке. И адрес первого элемента массива во второй. Это разные два адреса, у них разные типы.
Численно они совпадают потому что представляют доступ к одной и той же памяти.
Если создать простую структуру в стиле С и взять адрес объекта структуры и ее первого элемента - они тоже совпадут.
0
63 / 46 / 11
Регистрация: 27.12.2017
Сообщений: 1,484
19.02.2020, 08:27  [ТС]
DrOffset, arr - указатель на первый элемент внутреннего массива, соответственно указатель на массив, он же является указателей на первый элемент этого массива, & - оператор взятия адреса, если я применяю & к указатель то выходит адресс указателя, разве если я напишу & arr то это не будет адресс указателя?
0
Неэпический
 Аватар для Croessmah
18149 / 10731 / 2067
Регистрация: 27.09.2012
Сообщений: 27,038
Записей в блоге: 1
19.02.2020, 08:30
Цитата Сообщение от ReYalp Посмотреть сообщение
arr - указатель на первый элемент внутреннего массива
arr - массив, а не указатель!

Специально выделил, чтобы получше видно было, а то вдруг две страницы до этого Вы не смогли прочитать.
0
63 / 46 / 11
Регистрация: 27.12.2017
Сообщений: 1,484
19.02.2020, 08:32  [ТС]
Croessmah, но компилятор неявно заменяет везде arr на &arr[0]
0
Неэпический
 Аватар для Croessmah
18149 / 10731 / 2067
Регистрация: 27.09.2012
Сообщений: 27,038
Записей в блоге: 1
19.02.2020, 08:32
Цитата Сообщение от ReYalp Посмотреть сообщение
но компилятор неявно заменяет везде
Ничего он не заменяет. Где нужен указатель, применяется необходимое преобразование и не более того.
0
19501 / 10106 / 2461
Регистрация: 30.01.2014
Сообщений: 17,825
19.02.2020, 08:32
Цитата Сообщение от ReYalp Посмотреть сообщение
arr - указатель на первый элемент внутреннего массива, соответственно указатель на массив, он же является указателей на первый элемент этого массива, & - оператор взятия адреса, если я применяю & к указатель то выходит адресс указателя, разве если я напишу & arr то это не будет адресс указателя?
Всё не так.
Учите систему типов языка С++.

arr - это массив. Я же показывал пример с типом T выше. Внимательно его изучите и осмыслите.

&arr - даст указатель на массив

Также у массивов есть уникальная особенность, массив неявно приводится к указателю на свой первый элемент в определенных выражениях (а не во всех). Например вот здесь
C++
1
2
3
T arr[10];
 
auto p = arr;
тип p T *, тип arr - T[10].
0
63 / 46 / 11
Регистрация: 27.12.2017
Сообщений: 1,484
19.02.2020, 08:43  [ТС]
DrOffset, да у меня проблемы не со всей системой, а только с массивами, arr же почти всегда будет равен указатель на его первый элемент, вроде как только decltype выведет с него тип массива, вот есть массив int arr[10], если я сделаю & arr - что это?

Добавлено через 3 минуты
Croessmah, в книге чётко написано :"Однако у массивов есть одна особенность - места их использования компилятор автоматически заменяет указателем на первый элемент"

Добавлено через 2 минуты
DrOffset, arr - это массив, но как только дело доходит до момента std::cout << arr то это уже не массив, а указатель на его первый элемент, тогда &arr - операция взятия адреса указателя на первый элемент массива, ну что не так?
0
19501 / 10106 / 2461
Регистрация: 30.01.2014
Сообщений: 17,825
19.02.2020, 08:50
Цитата Сообщение от ReYalp Посмотреть сообщение
"Однако у массивов есть одна особенность - места их использования компилятор автоматически заменяет указателем на первый элемент"
ReYalp, это просто упрощение для того, чтобы не загромождать деталями пояснение. Именно поэтому одной книги не хватит для обучения. Вам когда в детстве говорили, что Земля имеет форму шара - это тоже было упрощение. Вы же теперь знаете, что Земля - это геоид? Если бы вам в 5 лет сказали, что Земля - это геоид, что бы вы поняли из этого?
Этим отличается учебник от профессиональной литературы. В учебнике делают упрощения, в профессиональной литературе - нет.
1
63 / 46 / 11
Регистрация: 27.12.2017
Сообщений: 1,484
19.02.2020, 08:54  [ТС]
DrOffset, но то что земля имеет форму шара - это неправда, а то что arr заменяется на &arr[0] это правда
0
19501 / 10106 / 2461
Регистрация: 30.01.2014
Сообщений: 17,825
19.02.2020, 08:58
Цитата Сообщение от ReYalp Посмотреть сообщение
arr - это массив, но как только дело доходит до момента std::cout << arr то это уже не массив, а указатель на его первый элемент, тогда &arr - операция взятия адреса указателя на первый элемент массива, ну что не так?
Пример:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
#include <iostream>
 
struct Array10
{
    operator int *()
    {
        return &m_array[0];
    }
    operator int const *() const
    {
        return &m_array[0];
    }    
    
    int m_array[10];
};
 
 
int main()
{
    Array10 arr;
    
    Array10 * p = &arr;
    
    std::cout << arr << std::endl;
    std::cout << &arr << std::endl;
}
Явление, которое демонстрирует код, точно такую же природу имеет, как в ситуации с массивами, разница только в том, что я это поведение сам описал вручную. У вас же не возникает желания в этом случае сказать, что &arr и arr - это одно и то же?

Цитата Сообщение от ReYalp Посмотреть сообщение
да у меня проблемы не со всей системой, а только с массивами,
Если у вас проблема с массивами, значит проблема со всей системой.
1
Неэпический
 Аватар для Croessmah
18149 / 10731 / 2067
Регистрация: 27.09.2012
Сообщений: 27,038
Записей в блоге: 1
19.02.2020, 09:00
Цитата Сообщение от ReYalp Посмотреть сообщение
если я сделаю & arr - что это?
Давай с простого. Понимаешь разницу между int и long?
C++
1
2
3
4
5
6
7
8
9
10
void foo(long);
void bar(long *);
//...
int i;
long d;
//...
foo(d);
foo(i);
bar(&d);
bar(&i);
Какой тип имеет переменная i? int.
Какой тип даст &i? int * - указатель на int.

Какой тип имеет переменная d? long.
Какой тип даст &d? long * - указатель на long.

Можно вызвать foo(d)? Да, можно.
Можно вызвать foo(i)? Да, можно. Но ведь тип переменной i - int, а функция приминает long. Как так? Применяется неявное преобразование типа и получается новая временная переменная типа long, которая и уходит в функцию.

Можно вызвать bar(&d)? Да, можно.
Можно вызвать bar(&i)? Нет, нельзя. А нельзя потому что не разрещается неявно преобразовывать указатель типа int * (указатель на int) в указатель типа long * (указатель на long).


С массивами тоже самое.
C++
1
2
3
4
5
6
void foo(int *);
//...
int arr[10];
//...
foo(arr);
foo(&arr);
Какой тип имеет переменная arr? int[10].
Какой тип даст &arr? int(*)[10] - указатель на массив из 10-ти int'тов

Можно вызвать foo(arr);? Да, можно. Но ведь тип переменной arr - int[10], а функция приминает int *. Применяется неявное преобразование типа и получается новая временная переменная типа int *, которая и уходит в функцию. Полученный указатель указывает на первый элемент массива.
Вот это оно и есть - "волшебное" преобразование из-за которого кажется, что массив - это указатель.

Можно вызвать foo(&arr);? Нет, нельзя. А нельзя потому что не разрещается неявно преобразовывать указатель типа int(*)[10] (указатель на массив int[10]) в указатель типа int * (указатель на int).

Теперь разница между массивом, указателем на массив и просто указателем на элемент этого массива) стала более наглядной?

Добавлено через 27 секунд
Цитата Сообщение от ReYalp Посмотреть сообщение
а то что arr заменяется на &arr[0] это правда
Это фигня какая-то, а не правда.

Добавлено через 1 минуту
Цитата Сообщение от ReYalp Посмотреть сообщение
Croessmah, в книге чётко написано :"Однако у массивов есть одна особенность - места их использования компилятор автоматически заменяет указателем на первый элемент"
В книге должно быть "неявно преобразовывает", а не "автоматически заменяет".
Но книга - это не спецификация, и неформально, получается одно и то же.
Это Вы почему-то не можете понять этого.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
19.02.2020, 09:00

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

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
60
Ответ Создать тему
Новые блоги и статьи
23. что сделано за последнее время.
anaschu 17.06.2026
• Эталон: Клиника НИИ питания РАМН, Москва — централизованный пищеблок, 225 коек, 180 пациентов • Git: репозиторий med2, ветка абсентеизм. Рабочий файл: СРесурсами1_v4. alp • Смежный проект:. . .
22. Подключение слоя системной динамики (потоковые диффуры): экономические метрики модели
anaschu 17.06.2026
Апдейт модели: финансовый контур, разделение затрат Продолжаю развивать модель рабочего коллектива на AnyLogic. В этот раз работа шла над агентом Экономика — финансовым SD-слоем модели. Задача:. . .
[golang] Insert Delete GetRandom O(1) (Leetcode: 380)
alhaos 16.06.2026
Insert Delete GetRandom O(1) Сложность: Medium Источник: LeetCode 380 Задача Реализовать структуру данных RandomizedSet, которая поддерживает следующие операции за O(1) в среднем:
Свет в конце тоннеля
kumehtar 16.06.2026
Поймал себя на одной мысли. Раньше мне всегда казалось неправильным жить без чёткого понимания, куда всё идёт. Будто я иду по дороге судьбы, но не знаю, куда она ведёт. А раз не знаю — значит,. . .
[golang] Реализация стека с поддержкой получения минимального элемента за O(1)
alhaos 16.06.2026
Min Stack Сложность: Medium Источник: LeetCode 155 Задача: Реализовать стек который поддерживает push, pop, top и получение минимального элемента за O(1). Методы:
[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
Когда в детстве ребёнок не получает от родителей чего-то важного, он лишается не просто приятных переживаний, а основы для формирования определённых внутренних качеств и навыков. Если ребёнок не. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru