Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.69/13: Рейтинг темы: голосов - 13, средняя оценка - 4.69
0 / 0 / 0
Регистрация: 29.03.2015
Сообщений: 58

Неясности в теории

11.10.2015, 19:55. Показов 4017. Ответов 68
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте! Объясните пожалуйста почему в параметрах функции чаще всего используют указатель на массив, а не сам массив, например, void display(int *num).
И еще один вопрос, для чего нужен знак % в данной функции:rand()%1999-999. То, что это функция заполнения рандомными числами,я знаю, но вот для чего там знак % ?
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
11.10.2015, 19:55
Ответы с готовыми решениями:

неясности с wi-fi
привет Форумчане! вообщем проблема у меня, ноутбук vaio серии vpcej, куплен в августе 2011 года, новый, и вот прошло пол года и первая...

Неясности с CASE IS
Здравствуйте, поясните пожалуйста что обозначает: SELECT CASE n CASE IS = 1 t1 = t ........... ...

Неясности anacron'a
Здравствуйте, Я пытаюсь понять для себя суть работы anacron'a. У меня Ubuntu 14.04 Собственно, у меня покамест три вопроса: 1.)...

68
306 / 101 / 18
Регистрация: 04.07.2014
Сообщений: 571
12.10.2015, 11:42
Студворк — интернет-сервис помощи студентам
Rius
Вот, правильные слова
Цитата Сообщение от gru74ik Посмотреть сообщение
Потому что в С++ обычные сишные массивы не являются объектами первого класса
По существу, в на низком уровне, на уровне C, вообще нет абстракции массива! Есть только последовательная память. И Вам остаётся только два варианта: обернуть эту память в свою абстракцию или оперировать низкоуровневыми возможностями -- адресами.
1
Модератор
Эксперт CЭксперт С++
 Аватар для sourcerer
5288 / 2376 / 342
Регистрация: 20.02.2013
Сообщений: 5,773
Записей в блоге: 20
12.10.2015, 14:13
Цитата Сообщение от hoggy Посмотреть сообщение
указатель на массив так же, как и ссылка на массив помнит размерности
hoggy, честно сказать, я тоже не понял, как указатель может хранить (помнить?) размер массива. Насколько я знаю, обычный сишный указатель хранит адрес и ничего более. И в случае передачи обычного сишного массива в функцию указатель хранит именно адрес первого элемента массива. Откуда ж там ещё возьмётся информация о размере массива? Вот это я никак в толк не возьму.
0
19501 / 10106 / 2461
Регистрация: 30.01.2014
Сообщений: 17,825
12.10.2015, 14:25
Цитата Сообщение от gru74ik Посмотреть сообщение
честно сказать, я тоже не понял, как указатель может хранить (помнить?) размер массива. Насколько я знаю, обычный сишный указатель хранит адрес и ничего более. И в случае передачи обычного сишного массива в функцию указатель хранит именно адрес первого элемента массива. Откуда ж там ещё возьмётся информация о размере массива? Вот это я никак в толк не возьму.
Он говорил о типизации, о времени компиляции, а не о времени исполнения.
Тип `указатель на массив` содержит в себе информацию о размере массива.
C++
1
T (*p)[N];
На основе этой информации можно, например, делать перегрузку, или выбирать специализацию шаблона.
1
306 / 101 / 18
Регистрация: 04.07.2014
Сообщений: 571
12.10.2015, 17:30
DrOffset
Цитата Сообщение от DrOffset Посмотреть сообщение
Тип
К тому и вопросы пошли. Указатель -- это, всё-таки, указатель, адрес. А его типовая метка отвечает за проверку времени компиляции. Но никто ничего не хранит.

А если отвечать слишком приблизительно и расплывчато, то это всё равно, что и не отвечать.
0
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
12.10.2015, 20:36
Цитата Сообщение от mporro Посмотреть сообщение
Как передать массив в функцию, чтобы все побочные эффекты работы с массивом внутри функции не затронули внешний контекст
там где то выше был пример передачи по значению за счет промежуточной структуры.

Цитата Сообщение от gru74ik Посмотреть сообщение
Либо пользоваться средствами нового стандарта (C++14), как это сделал hoggy (передавать ссылку или указатель и использовать ключевое слово auto).
не обязательно использовать auto.
auto - это лишь синтаксический сахар.
выше где то были мои примеры,
как получить такой же результат при помощи "классических" шаблонов.

если же количество элементов прибито гвоздями,
то можно передавать ссылку/указатель на массив без всяких шаблонов.

Цитата Сообщение от mporro Посмотреть сообщение
Нет, это не то. Вы передали в функцию структуру, совершенно иной объект. Структура действительно скопируется, но это уже данные, определённые пользователем.
формально, нельзя передавать массивы по значению.
но это - не более чем формальность.

отталкиваться то нужно от задачи.
можно например на шаблонах поиметь нужный эффект,
без необходимости порождать пользовательскую структуру в клиентском коде:

Цитата Сообщение от gru74ik Посмотреть сообщение
а заполнить массив новыми значениями в такой же манере получится?
в какой, в такой же?

Добавлено через 2 минуты
Цитата Сообщение от gru74ik Посмотреть сообщение
честно сказать, я тоже не понял, как указатель может хранить (помнить?) размер массива. Насколько я знаю, обычный сишный указатель хранит адрес и ничего более.
верно.
ключевые слова "обычный сишный указатель".

"указатель на массив" - это не "обычный сишный указатель".

C++
1
2
3
int ar[] ={1,2};
int* p = ar; //<--- указатель на int (не намассив)
int (*pa)[2] = &ar ; //<--- указатель на массив
указатель на массив хранит информацию о природе массива в своем типе.

Добавлено через 5 минут
Цитата Сообщение от mporro Посмотреть сообщение
К тому и вопросы пошли. Указатель -- это, всё-таки, указатель, адрес. А его типовая метка отвечает за проверку времени компиляции. Но никто ничего не хранит.
указатель - это тип данных.
адрес - это значение объекта имеющего тип данных "указатель".

понятно, что "циферки" ничего не хранят.
но это не принципиально.

принципиально, что в статике можно пропасти тип указателя-на-массив,
и поиметь информацию о его размерностях.

с++ позволяет много различной нужной информации извлекать времени компиляции.
0
306 / 101 / 18
Регистрация: 04.07.2014
Сообщений: 571
12.10.2015, 20:40
Цитата Сообщение от hoggy Посмотреть сообщение
но это - не более чем формальность.
Это гораздо больше, чем формальность. Это следствие того, что абстракции массива в C просто нет. В Pascal есть массивы, например.
В C++, конечно, тоже есть массивы, выраженные уже в терминах новых для C методов "абстракции".

Добавлено через 4 минуты
Цитата Сообщение от hoggy Посмотреть сообщение
указатель - это тип данных.
Да, соглашусь.
Тем не менее, стоило сделать акцент именно на том, что разной длины массивы могут быть выражены разными типами данных, а не говорить, что кто-то что-то "хранит".
1
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
12.10.2015, 20:44
Цитата Сообщение от mporro Посмотреть сообщение
что абстракции массива в C просто нет
есть там все.
есть моральный тип массива.
есть моральный тип указателя-на-массив.

Добавлено через 1 минуту
Цитата Сообщение от mporro Посмотреть сообщение
Тем не менее, стоило сделать акцент именно на том, что разной длины массивы могут быть выражены разными типами данных, а не говорить, что кто-то что-то "хранит".
тип данных именно хранит информацию о типе элементов,
и обо всех размерностях массива, на который он указывает
0
306 / 101 / 18
Регистрация: 04.07.2014
Сообщений: 571
12.10.2015, 20:50
Цитата Сообщение от hoggy Посмотреть сообщение
есть моральный тип указателя-на-массив.
Нет. Я не буду длить с Вам эту дискуссию.
Но Ваши иллюзии точно не стоит транслировать новичкам, которые потом будут только путаться в относительно простом языке, выискивая там несуществующие массивы.

Цитата Сообщение от hoggy Посмотреть сообщение
тип данных именно хранит информацию о
В С тип данных ничего не "хранит". По факту Вы можете только сравнить типовые метки, может быть компилятор даже не использует чисел в описании этих меток. Употреблять столь сильное слово -- пагубная страсть.
0
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
12.10.2015, 21:01
Цитата Сообщение от mporro Посмотреть сообщение
Но Ваши иллюзии точно не стоит транслировать новичкам, которые потом будут только путаться в относительно простом языке, выискивая там несуществующие массивы.
мои иллюзии описаны в стандарте языка си.

все что осталось понять новичку:

1.
что массив может неявно каститься к указателю на свой первый элемент.
но сам по себе такой указатель не имеет нималейшего отношения к массивам.

то, что он на самом деле смотрит на начало массива - это лишь в голове программиста.
с точки зрения компилятора - он смотрит тупо на какой-то одиночный объект.

2.
что существует тип данных "указатель-на-массив".
и вот его компилятор интерпритирует,
именно как указатель на сам массив.

такой тип данных несет в себе информацию о природе массива,
на который он указывает.

Цитата Сообщение от mporro Посмотреть сообщение
В С тип данных ничего не "хранит"
все он хранит.
сишка в этом смысле отличается лишь раздолбайством:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include  <stdio.h>
 
// <--- expected ‘const int (*)[3]’ but argument is of type ‘const int (*)[2]’
void foo( const int (*pArr)[3] )
{
    for(size_t n=0;n<3;++n)
        printf("%d, ", (*pArr)[n] );    
}
 
int main(void)
{
    printf("Hello, world!\n");
    
    const int a[]={1,2};
    
    // <--- warning: passing argument 1 of ‘foo’ from incompatible pointer type
    foo(&a);
    
    return 0;
}
а так же невозможностью использовать статическую информацию времени компиляции.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
12.10.2015, 21:01

Неясности с наследованием (C#)
Добрый день. Никак не могу разобраться с некоторыми элементами наследования в C#. Вырезка из книги: &quot;A a2 = new C() означает, что вы...

Неясности с функцией exit...
Здравствуйте, есть программа, из которой вызывается dll-ка. В dll-ке есть сравнение дат, к примеру, если результат не устраивает, нужно...

Неясности со StrigGrid-ами
Имеется 2 StringGrid (см. вложенный рис.). В первый загружаются данные из Excel, далее они определенным образом пересчитываются и...

Некоторые неясности с задачей
Имеется задача: вырезано Имеется ее решение: #include &lt;stdio.h&gt; #include &lt;iostream&gt; int main () { ...

Неясности в работе программы
Доброго всем времени суток! :) Уже час пытаюсь понять почему во время исполнения этого кода (в borland, Cи), при вводе цифр ( через...


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

Или воспользуйтесь поиском по форуму:
69
Ответ Создать тему
Новые блоги и статьи
Сукцессия 20. Война автоботов. Делаем ставки. Лёд против "пш-пш!".
anaschu 11.07.2026
Битва ИИ в ризосфере: Как мы скрестили жесткие ОДУ, закон Фика и «подземный шантаж» Уважаемые коллеги! Хочу поделиться уникальным опытом ведения междисциплинарной компьютерной разработки. Прямо. . .
Сукцессия 19. Какие выводы я сделал из модели? Часть 2.Внутримикоризный стехиометрический буфер и хроно-дискретные зоны экспансии
anaschu 11.07.2026
Био-Инженерный Ликбез: Архитектура Модели Ризосферы Математический аппарат моделирования
Сукцессия 18. Какие выводы я сделал из войны грибов с деревьями? Часть 1- рассказ и немного про термины
anaschu 11.07.2026
Био-Инженерный Ликбез: Архитектура Модели Ризосферы Математический аппарат моделирования Система ОДУ описывает динамику изменения массы различных компонентов системы во времени. Ключевой. . .
Просветление в 5 секунд
kumehtar 10.07.2026
Андрей Веретенников выдал фразу недавно: "Вам не обязательно кем-то себя считать"
Эксперимент с картинкой-обложкой на CodinGame
Adler 10.07.2026
Решил на днях провести эксперимент. У меня есть аккаунт на CodinGame, ТОП-3 по РФ среди 2200 участников (в разделе соревнования по программированию ИИ-ботов). Там есть обложка, куда можно влепить. . .
GitDOS: Когда я решил скрестить MS-DOS, GitHub и Claude
MaGz GoLd 08.07.2026
Привет, Киберфорум! Хочу поделиться своим проектом, который, надеюсь, вас заинтересует. GitDOS — это веб-приложение, которое позволяет запускать DOS в браузере с тремя крутыми фичами: диски живут в. . .
Учебный мини "цифровой двойник" = (Сервер = Java + Flask_питон )+(3D = Гугловскаая 4T nvideo + google colab) +( WMS = Odoo на Docker)
anaschu 07.07.2026
Увидел в требованиях к вакансии создателя имитационных моделей связку (REst + Api + WMS + Anylogic + питон + 3D Nvideo), и решил посмотреть, что это такое. Из этого всего я работал более менее. . .
Море в объективе
kumehtar 06.07.2026
Хотел написать много проникновенных слов, но передумал. Оно само - говорит. Кто слышит тот слышит.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru