2 / 5 / 1
Регистрация: 13.09.2015
Сообщений: 100
|
|
1 | |
Что означает запись int (*a)[10]?15.02.2017, 21:48. Показов 21911. Ответов 24
Метки нет (Все метки)
2
|
15.02.2017, 21:48 | |
Ответы с готовыми решениями:
24
Что означает запись int **a Что означает запись std::int? Что означает эта запись? int(*px)[5] = 0; cout << px; Нюансы синтаксиса: что означает запись arr[(int)(u*10)]++; ? |
63 / 63 / 39
Регистрация: 18.11.2016
Сообщений: 562
|
|
15.02.2017, 21:50 | 2 |
Думаю, указатель на массив.
0
|
8972 / 4318 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
|
|
15.02.2017, 22:06 | 3 |
1
|
2 / 5 / 1
Регистрация: 13.09.2015
Сообщений: 100
|
||||||
15.02.2017, 22:17 [ТС] | 4 | |||||
hoggy, если это так, то как обращаться к элементам? Следующий код не компилится:
0
|
5877 / 4754 / 2939
Регистрация: 20.04.2015
Сообщений: 8,361
|
|
15.02.2017, 22:18 | 5 |
0
|
2549 / 1208 / 358
Регистрация: 30.11.2013
Сообщений: 3,826
|
||||||
15.02.2017, 22:31 | 6 | |||||
Кажись hoggy, как всегда прав
0
|
5877 / 4754 / 2939
Регистрация: 20.04.2015
Сообщений: 8,361
|
||||||
15.02.2017, 22:36 | 7 | |||||
rikimaru2013,
А в чем отличие от такого варианта?
0
|
2549 / 1208 / 358
Регистрация: 30.11.2013
Сообщений: 3,826
|
|
15.02.2017, 22:38 | 8 |
Даценд, вы кастите вниз указатель на массив к указателю на участок памяти. При касте вниз не узнать никогда размер переданного указателя на память. Если очень попросите - поищу у себя ссылку на тему, где обсуждалось про каст-вниз указателя на массив
1
|
70 / 70 / 35
Регистрация: 06.07.2016
Сообщений: 415
|
|
15.02.2017, 22:40 | 9 |
Указатель на массив из 10 значений типа int.
Источник - http://algcourse.cs.msu.su/wp-... 8-2016.pdf , страница 9.
0
|
|
|
15.02.2017, 22:52 | 10 |
Например, как выполнится операция "a++"
C int (*a)[10]; int *b; int main (void) { a++; b++; return 0; } Код
$ gcc t.c -O1 -S $ cat t.s ... addl $40, _a addl $4, _b ... Добавлено через 3 минуты До кучи: Указатель на массив char и прочее
8
|
8972 / 4318 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
|
|
15.02.2017, 22:54 | 11 |
массив неявно кастится к указателю на его самый первый элемент.
ну а дальше уже идет работа с обычным указателем. Добавлено через 49 секунд он скастил массив по значению к указателю на первый элемент. а не указатель на массив.
1
|
2 / 5 / 1
Регистрация: 13.09.2015
Сообщений: 100
|
|
15.02.2017, 23:00 [ТС] | 12 |
Вроде понял, что это указатель на массив из 10 интов. Но как всё-таки обращаться к этим элементам?
0
|
2549 / 1208 / 358
Регистрация: 30.11.2013
Сообщений: 3,826
|
|
15.02.2017, 23:17 | 13 |
Для учебников обучение С++ указатель на первый элемент это и есть указатель на статический массив. Я вот тоже первый раз услышал, что есть реальный указатель на массив. А вы придираетесь!
0
|
Вездепух
12812 / 6684 / 1800
Регистрация: 18.10.2014
Сообщений: 16,935
|
||||||||||||||||
15.02.2017, 23:35 | 14 | |||||||||||||||
Это как это? Этот код компилируется без проблем: http://coliru.stacked-crooked.... 5d22a8741f
Другое дело, что указатель не проинициализирован, т.е. содержит мусор. Соответственно доступ через такой указатель заставляет программу падать. Формально, компилятор, конечно имеет право отказаться компилировать программу, поведение которой не определено. Проинициализируйте указатель и все будет в порядке
Добавлено через 5 минут Присутствующим должно быть понятно, что
0
|
2549 / 1208 / 358
Регистрация: 30.11.2013
Сообщений: 3,826
|
|
15.02.2017, 23:40 | 15 |
Мне к примеру не понятно зачем указатель на массив, если при передаче по значению статический массив не копируется, и передаётся ссылкой. Зачем указатель если дефакто все привыкли к ссылке на статический массив. Можете навести пример где это масс-хев или решает какуе-то проблему, что не решить другим способом? Даёт преимущества?
0
|
Вездепух
12812 / 6684 / 1800
Регистрация: 18.10.2014
Сообщений: 16,935
|
||||||||||||||||||||||||||
16.02.2017, 00:12 | 16 | |||||||||||||||||||||||||
Сообщение было отмечено rikimaru2013 как решение
Решение
Как раз таки наоборот! Передача массива по указателю на его элемент - это специализированный трюк, предназначенный для решения очень специфической задачи: поддержки возможности передачи массивов разного размера. При этом размер массива следует передавать отдельно.
Но если вас не интересует передача массивов разного размера, т.е. размер массива всегда фиксирован, то передавать его надо именно по указателю на массив (или, в С++, по ссылке на массив). Благодаря такой передаче компилятор сможет произвести контроль типов и убедиться, что размер массива правилен. Например (искусственный пример), мы работаем с трехмерной графикой и точка у нас задается массивом из трех int координат. Мы хотим написать функцию трансформации координат точки. Как нам ее объявить? Так
Оба варианта будут работать и генерировать один и тот же код. Но! В первом случае вы сможете сделать так
А во втором случае такой номер не пройдет. Вам придется передавать указатели именно на массивы int[3] и больше ни на что. Вот ради этого контроля типов и используются указатели вроде int (*a)[10] .---- Отдельно стоит заметить, что работая с многомерными массивами в С или С++ вы сами того не замечая (или замечая) сталкиваетесь именно с такими указателями:
a в этом контексте имеет тип double (*)[20] и именно к нему вы применяете оператор [i] .Передавая массив в функцию как
char (*)[40] .
8
|
70 / 70 / 35
Регистрация: 06.07.2016
Сообщений: 415
|
|||||||||||
16.02.2017, 00:18 | 17 | ||||||||||
То есть , можно сделать вот так :
И что конкретно происходит на аппаратном уровне при вызове
То есть мы разыменовываем указатель, получаем блок,на который он указывает, а затем обращаемся в этом блоке к "подблоку" размера int с индексом counter, как при работе с массивом?
0
|
2549 / 1208 / 358
Регистрация: 30.11.2013
Сообщений: 3,826
|
||||||
16.02.2017, 00:23 | 18 | |||||
Если уж используете статический массив можно использовать все прелести его
1
|
|
|
16.02.2017, 20:26 | 19 |
Тип переменной array есть "int[10]". Тип выражения "&array" есть "int(*)[10]" и он совпадает с типом переменной pointer_array
Не по теме: Эти два абзаца можно не читать, их тут описал только для полноты картины Когда речь идёт об указателе на массив, то номинально компилятор работает с ним точно так же, как и с указателем на int или float. Т.е. как бы происходит чтение указателя в регистр, затем чтение из указателя массива в виртуальный 40-байтный регистр - отработали операцию языка (*pointer_array). Потом к значению этого виртуального 40-байтного регистра применяется операция [counter] (условно декомпозиция элемента массива) и выделяет из этих 40 байт нужное 4-байтное значение. Но поскольку 40-байтных регистров нет, то внутри компилятора вся эта цепочка виртуальных операций как бы схлопывается и строится код, который читает значение указателя, а потом читает 4 байта из адреса "указатель + counter * 4". Т.е. с точки зрения построенного машинного кода уже невозможно понять, что в исходнике было написано - работы с обычным указателем или работа с указателем на массив. Технически оба варианта приводят к одному и тому же коду В принципе, TheCalligrapher уже всё это выше пояснил. Принципиальное различие между двумя вариантами в том, что в одном компилятор может проконтролировать выход за границу массива (поскольку после разыменования как бы образуется массив с известным размером), а в другом - нет
1
|
70 / 70 / 35
Регистрация: 06.07.2016
Сообщений: 415
|
|
16.02.2017, 23:34 | 20 |
Да, вроде бы понятно, спасибо.
Пользуясь случаем, хотел бы попросить совета по поводу литературы именно по этой тематике - даже не знаю, как ее назвать. "Как компьютер понимает то, что я ему предлагаю", что ли. Я хочу знать, как он это интерпретирует, во что превращает мои выражения, что он может понять лучше, что хуже, где компилятору придется за меня сделать какую-то работу и как ему с этим помочь. У меня нет такой дисциплины, все в один голос говорят, что это и не нужно "пока". Но я так не думаю. Даже на уровне простейших программ мне хотелось бы быть уверенным, что я всё понимаю правильно. Для меня абстракция - хорошо, но ее же и так хватает. Сейчас постепенно читаю "Пильщиков. Программирование на языке ассемблера IBM PC", но без набора АСМ-го кода, просто внимательно и с расстановкой пытаюсь понять, как это всё там происходит.
0
|
16.02.2017, 23:34 | |
16.02.2017, 23:34 | |
Помогаю со студенческими работами здесь
20
Нюансы синтаксиса: что означает запись vector<int*> a и vector <int>*a ? Что означает ошибка too few arguments to function ‘int my_func(int, int)’ (язык C++)? Что означает эта строка? int _tmain(int argc, _TCHAR* argv[]) Что означает int pos = 0; int value = 5; в данном коде? Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи | |||||
[golang] 80. Remove Duplicates from Sorted Array II
alhaos 28.01.2025
В предоставленном упорядоченном по возрастанию целочисленном слайсе, оставить уникальные элементы полюс один возможный дубликат. Вернуть количество таких элементов.
/ / . . .
|
Что такое внедрение зависимостей и для чего оно применяется
bytestream 27.01.2025
В современной разработке программного обеспечения одной из ключевых проблем является управление зависимостями между различными компонентами системы. Внедрение зависимостей (Dependency Injection, DI). . .
|
Как установить cellpadding и cellspacing в CSS
bytestream 27.01.2025
При создании веб-страниц с табличными данными разработчики часто сталкиваются с необходимостью правильного оформления внутренних и внешних отступов в таблицах. В традиционной разметке HTML для этих. . .
|
Чем отличаются public, protected, package-private и private в Java
bytestream 27.01.2025
В языке программирования Java механизм модификаторов доступа играет ключевую роль в реализации одного из фундаментальных принципов объектно-ориентированного программирования - инкапсуляции. . . .
|
Зачем нужно explicit в C++. Преобразование типов
bytestream 27.01.2025
В мире программирования на C++ управление преобразованием типов данных играет crucial роль в создании надежного и безопасного кода. Язык C++ предоставляет множество механизмов для контроля над. . .
|
Как создать удалённую (remote) ветку в Git
bytestream 27.01.2025
Система контроля версий Git стала неотъемлемой частью современной разработки программного обеспечения, предоставляя разработчикам мощные инструменты для управления кодовой базой. Одним из ключевых. . .
|
Как создать утечку памяти в Java
bytestream 27.01.2025
Утечка памяти в Java представляет собой ситуацию, когда программа неэффективно использует доступную память, удерживая ссылки на объекты, которые больше не нужны для работы приложения. Несмотря на. . .
|
КуМир: как решать задачи на числа
bytestream 27.01.2025
КуМир (Комплект Учебных МИРов) представляет собой уникальную образовательную среду программирования, разработанную специально для обучения основам алгоритмизации и программирования. Эта система. . .
|
Исполнитель Черепаха в КуМир: как решать задачи
bytestream 27.01.2025
Исполнитель Черепаха в системе КуМир представляет собой мощный образовательный инструмент, который помогает освоить основы программирования через визуальное представление результатов выполнения. . .
|
КуМир: как решать задачи на массивы
bytestream 27.01.2025
Массивы представляют собой важнейшую структуру данных в программировании, и система КуМир предоставляет удобные инструменты для работы с ними. В контексте КуМир массив можно представить как. . .
|
[golang] 26. Remove Duplicates from Sorted Array
alhaos 27.01.2025
Необходимо удалить дубликаты из предоставленного целочисленного отсортированного по взрастанию слайса, нужно изменить значения в слайсе и вернуть количество элементов.
/ / . . .
|
КуМир, исполнитель Робот. Решение задач
bytestream 27.01.2025
КуМир (Комплект Учебных МИРов) представляет собой образовательную среду для обучения программированию, которая была создана в Отделении информатики Российской Академии наук. Эта система разработана. . .
|