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

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

11.10.2015, 19:55. Показов 4610. Ответов 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
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
11.10.2015, 21:54
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от castaway Посмотреть сообщение
Хочу.
я не удивлен.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include <iostream>
 
void view(const int (*p)[3])
{
    for(const auto& i: *p)
        std::cout<< i <<", ";
    std::cout<<'\n';
}
 
int main()
{
    std::cout << "Hello, world!\n";
    
    const int a[] {1,2,3};
    
    view (&a);
}
0
1373 / 596 / 199
Регистрация: 02.08.2011
Сообщений: 2,886
11.10.2015, 21:57
Добавлено через 19 секунд
hoggy,Ясно. Но это не будет компилироваться не в gcc, не потому что все остальное не полностью соответствует стандартам, а потому что у gcc'шников местами включены нестандартные фишки. Я пробовал с С++17, C++14 (В онлайн компиляторах)
0
Эксперт С++
4986 / 3093 / 456
Регистрация: 10.11.2010
Сообщений: 11,170
Записей в блоге: 10
11.10.2015, 22:01
Цитата Сообщение от hoggy Посмотреть сообщение
я не удивлен.
А я не удивлён в том, что так и не было доказано что указатель хранит размер массива.
0
Эксперт .NET
 Аватар для Rius
13826 / 7898 / 1707
Регистрация: 25.05.2015
Сообщений: 23,975
Записей в блоге: 14
11.10.2015, 22:06
Цитата Сообщение от castaway Посмотреть сообщение
Давай вернёмся к старым временам:
Давайте:
Цитата Сообщение от castaway Посмотреть сообщение
Можете привести пример того, как передать все 100500 значений массива в функцию?
В #19 пример того, как передать массив по значению.

На исходный вопрос я ответил ещё в #7. Простой массив передаётся одинаково в этих трёх случаях: (int x[]), (int *x) и (int x[N]).
Цитата Сообщение от castaway Посмотреть сообщение
А зачем тогда отвечать в фантастическом (невозможном) стиле?
Чтобы писать понятный код в любом случае. Ну, ещё можно отправить зубрить труды корифеев, там всё по правилам. Или, Вы могли ответить сразу в полном объёме, а не задавать очевидный вопрос, ответ на который Вам известен.
castaway, Вы не хотите соблюдать правила хорошего тона, о которых вспомнили?
0
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
11.10.2015, 22:07
Цитата Сообщение от daslex Посмотреть сообщение
Но это не будет компилироваться не в gcc, не потому что все остальное не полностью соответствует стандартам, а потому что у gcc'шников местами включены нестандартные фишки. Я пробовал с С++17, C++14 (В онлайн компиляторах)
я не буду говорить за шланг.
возможно он просто не поддерживает эту фичу.

однако, это стандарт.
правда не помню точно из какого.
наверное с++14.

можно указывать auto в лямбдах (шаблоно лямбды).
ну и далее - можно указывать в обычных функциях.

Цитата Сообщение от castaway Посмотреть сообщение
А я не удивлён в том, что так и не было доказано что указатель хранит размер массива.
то есть, код из #41 вы проигнорировали.
ну-ну.
0
Эксперт С++
4986 / 3093 / 456
Регистрация: 10.11.2010
Сообщений: 11,170
Записей в блоге: 10
11.10.2015, 22:13
Цитата Сообщение от Rius Посмотреть сообщение
В #19 пример того, как передать массив по значению.
Нет. В 19-м сообщении пример передачи структуры, а не массива.

Добавлено через 3 минуты
Цитата Сообщение от hoggy Посмотреть сообщение
то есть, код из #41 вы проигнорировали.
ну-ну.
С чего бы? Там фигурирует указатель на массив, размер которого хранит сам массив, а не указатель на него.
0
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
11.10.2015, 22:16
Цитата Сообщение от castaway Посмотреть сообщение
Там фигурирует указатель на массив, размер которого хранит сам массив, а не указатель на него.
вам стоит подучить с++.

там фигурирует "указатель на массив".
не больше, и не меньше.
0
Эксперт С++
4986 / 3093 / 456
Регистрация: 10.11.2010
Сообщений: 11,170
Записей в блоге: 10
11.10.2015, 22:17
Цитата Сообщение от hoggy Посмотреть сообщение
там фигурирует "указатель на массив".
А я что сказал?
0
Эксперт .NET
 Аватар для Rius
13826 / 7898 / 1707
Регистрация: 25.05.2015
Сообщений: 23,975
Записей в блоге: 14
11.10.2015, 22:20
Цитата Сообщение от castaway Посмотреть сообщение
Нет. В 19-м сообщении пример передачи структуры, а не массива.
Да. Но, в то же время, это способ передачи массива по значению. Когда "если очень хочется, то можно".
0
Эксперт С++
4986 / 3093 / 456
Регистрация: 10.11.2010
Сообщений: 11,170
Записей в блоге: 10
11.10.2015, 22:25
Цитата Сообщение от Rius Посмотреть сообщение
Да. Но, в то же время, это способ передачи массива по значению. Когда "если очень хочется, то можно".
Это понятно, но всё это - отхождение от изначального вопроса. Из вопроса ТС понятно что он имел в виду не такой способ.
0
Эксперт .NET
 Аватар для Rius
13826 / 7898 / 1707
Регистрация: 25.05.2015
Сообщений: 23,975
Записей в блоге: 14
11.10.2015, 22:35
Согласен. Смысл моего первого ответа - передавайте по указателю, чтобы не транжирить ресурсы. И пишите одинаково, чтоб было понятно. Про ресурсы к массивам не относится, частный случай. Но вопрос был - почему чаще пишут int *x, а не то же это самое что просто массив, или нет.
0
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
11.10.2015, 22:39
Цитата Сообщение от castaway Посмотреть сообщение
А я что сказал?
Цитата Сообщение от castaway Посмотреть сообщение
С чего бы? Там фигурирует указатель на массив, размер которого хранит сам массив, а не указатель на него.

111111
0
Эксперт С++
4986 / 3093 / 456
Регистрация: 10.11.2010
Сообщений: 11,170
Записей в блоге: 10
11.10.2015, 22:41
Цитата Сообщение от Rius Посмотреть сообщение
Но вопрос был - почему чаще пишут int *x, а не то же это самое что просто массив, или нет.
Исходя из вопроса ТС я представляю два варианта:
C++
1
2
void foo( int * p ) { ... }
void foo( int p[10] ) { ... }
0
Эксперт .NET
 Аватар для Rius
13826 / 7898 / 1707
Регистрация: 25.05.2015
Сообщений: 23,975
Записей в блоге: 14
12.10.2015, 07:25
Да. Только эти два равнозначных варианта не объясняют, почему ТС-у кажется более частым применение первого варианта.
0
Модератор
Эксперт CЭксперт С++
 Аватар для sourcerer
5288 / 2376 / 342
Регистрация: 20.02.2013
Сообщений: 5,773
Записей в блоге: 20
12.10.2015, 07:55
Цитата Сообщение от hoggy Посмотреть сообщение
это c++11y
Цитата Сообщение от hoggy Посмотреть сообщение
так обозначается стандарт новее, чем с++11
Если мне не изменяет память, то это из флагов:
  1. до тех пор пока не утвердили стандарт C++11 он обозначался так:
    С++0x
  2. после утверждения C++11 его стали обозначать так:
    С++11
  3. до тех пор пока не утвердили стандарт C++14 он обозначался так:
    С++1y
  4. после утверждения C++14 его стали обозначать так:
    С++14
  5. до тех пор пока не утвердили стандарт C++17 он обозначается так:
    С++1z
  6. после утверждения C++17 он, видимо, будет обозначаться так:
    С++17
0
306 / 101 / 18
Регистрация: 04.07.2014
Сообщений: 571
12.10.2015, 10:08
hoggy
Вопрос castaway можно переформулировать в виде теста.

Как передать массив в функцию, чтобы все побочные эффекты работы с массивом внутри функции не затронули внешний контекст? Не запрещать побочные эффекты, а скопировать массив.

C
1
2
3
4
5
6
7
8
9
10
void side_array(?); /* какая тут типовая метка или что-то ещё */
 
int main()
{
    int array[3] = {1,1,1};    
 
    side_array(?); /* передать что-то от array массив */    
 
    return 0;
}

P.S. Насколько я понимаю с массивами C ничего придумать не получиться, нет возможности скопировать массив, можно только передать адрес на память, где массив хранится. То есть, возникнет необходимость выполнить вручную копирование массива во внешнем контексте, а затем всё равно передавать адрес в функцию.
0
Эксперт .NET
 Аватар для Rius
13826 / 7898 / 1707
Регистрация: 25.05.2015
Сообщений: 23,975
Записей в блоге: 14
12.10.2015, 10:26
Так чтоли?
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include "stdafx.h"
 
#define SIZE (10)
 
typedef struct {
    int array[SIZE];
} tSt;
 
void side_array(tSt st) /* какая тут типовая метка или что-то ещё */
{
    st.array[0] = 10;
}
 
int _tmain(int argc, _TCHAR* argv[])
{
    int array[SIZE] = { 1, 1, 1 };
    side_array(*(tSt *)array); /* передать что-то от array массив */
    return 0;
}
В функцию передаётся копия массива. В виде структуры, но всё-таки не вручную сделанная копия.
0
Модератор
Эксперт CЭксперт С++
 Аватар для sourcerer
5288 / 2376 / 342
Регистрация: 20.02.2013
Сообщений: 5,773
Записей в блоге: 20
12.10.2015, 11:21
Цитата Сообщение от Benzema Посмотреть сообщение
Здравствуйте! Объясните пожалуйста почему в параметрах функции чаще всего используют указатель на массив, а не сам массив, например, void display(int *num).
Потому что в С++ обычные сишные массивы не являются объектами первого класса (first class citizen). И поэтому их нельзя передать в функцию как некую единую сущность. Поэтому в функцию передают указатель на первый элемент массива и размер массива (чаще всего как целочисленную переменную), либо передают два указателя - на начало и конец массива.
Если нет желания передавать массив при помощи указателей, то можно сделать обёртку - завернуть массив в структуру или в класс. И передавать массив в функцию уже как экземпляр класса.
Либо пользоваться средствами нового стандарта (C++14), как это сделал hoggy (передавать ссылку или указатель и использовать ключевое слово auto).
1
306 / 101 / 18
Регистрация: 04.07.2014
Сообщений: 571
12.10.2015, 11:27
Rius
Нет, это не то. Вы передали в функцию структуру, совершенно иной объект. Структура действительно скопируется, но это уже данные, определённые пользователем.
1
Модератор
Эксперт CЭксперт С++
 Аватар для sourcerer
5288 / 2376 / 342
Регистрация: 20.02.2013
Сообщений: 5,773
Записей в блоге: 20
12.10.2015, 11:36
hoggy, а заполнить массив новыми значениями в такой же манере получится?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
12.10.2015, 11:36

Неясности с наследованием (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и), при вводе цифр ( через...


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

Или воспользуйтесь поиском по форуму:
60
Ответ Создать тему
Новые блоги и статьи
Особенности gif сгенерированных в Си
russiannick 21.10.2026
Рассмотрим генерацию gif файлов, которые в Си имеют свои особенности. Gif представляет собой графический формат популярный в интернете. Посмотрим на палитру. Gif файл сгенерированный в си отличается. . .
FPS контроллер с анимированными Y-Bot и 3D-звуком miniaudio (Box3D, Recast, BehaviorTree.CPP, ozz-animation, ImGui, OpenGL и SDL3)
8Observer8 18.10.2026
Содержание блога | English Version Полное мультиплатформенное руководство по стартовому проекту с FPS-контроллером игрока, анимированными роботами Y-Bot с 4-слойным блендингом, 3D-физикой Box3D,. . .
Локальный http сервер
Argus19 17.10.2026
Локальный http сервер На работе, на двух локальных компьютерах круглосуточно работают программы опроса приборов с записью в книги Excel,которые раз в сутки записываются на сервер компании. Т. к. . . .
Копировать Windows на новый диск на UEFI
damix 17.10.2026
https:/ / uriesk. wordpress. com/ 2016/ 11/ 01/ move-window-10-to-ssd-on-a-uefi-dualboot-system-with-basic-linux-tools/ TL DR Вставляем диск, а старый подключаем через переходник, грузимся с лайва. . .
ИИ не может найти нужный язык в списке
Supersumestria 05.10.2026
Я ему даю вот такое изображение и прошу найти и подчеркнуть немецкий язык. Возвращает он вот это: https:/ / i. **********/ vqBWLe2. png Нужную строчку в 3й колонке просто выдумал. . Это. . .
Новая последняя моя музыка в SUNO
zorxor 05.10.2026
Здравствуйте, дорогие мои друзья! С большой радостью я хотел бы представить вам свою новую последнею музыку, которую сгенерировала мне по моей просьбе нейросеть SUNO. С уважением, zorxor. Это. . .
Программный домашний кинотеатр
russiannick 27.09.2026
Сподобился на программный домашний кинотеатр. В качестве ЯВУ по традиции выбрал js. В помощники взял Яндекс-Алису. Было создано три зала на разные интересы. исторические и ретро сериал Хичкок. . .
Беседа с ИИ о программистах, недопускающих к созданию и правке кода генеративные ИИ и причины этого
zorxor 21.09.2026
Раньше я радовался или получал некоторые эмоции, пусть небольшие, но всё же, от самого процесса написания кода, рекомпиляции и запуска, видя постепенное развитие программы и прочее. А теперь лень. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru