Форум программистов, компьютерный форум CyberForum.ru

Неясности в теории - C++

Восстановить пароль Регистрация
 
 
Benzema
0 / 0 / 0
Регистрация: 29.03.2015
Сообщений: 58
11.10.2015, 19:55     Неясности в теории #1
Здравствуйте! Объясните пожалуйста почему в параметрах функции чаще всего используют указатель на массив, а не сам массив, например, void display(int *num).
И еще один вопрос, для чего нужен знак % в данной функции:rand()%1999-999. То, что это функция заполнения рандомными числами,я знаю, но вот для чего там знак % ?
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
11.10.2015, 19:55     Неясности в теории
Посмотрите здесь:

Подсчёт выражения. Разработка программы и неясности с функцией pow C++
C++ Вопросы по теории
Немного теории C++
C++ Вопросы по теории C++
Неясности в работе программы C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
hoggy
5230 / 2121 / 404
Регистрация: 15.11.2014
Сообщений: 4,812
Завершенные тесты: 1
11.10.2015, 21:54     Неясности в теории #41
Цитата Сообщение от 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);
}
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
daslex
1084 / 494 / 101
Регистрация: 02.08.2011
Сообщений: 2,408
11.10.2015, 21:57     Неясности в теории #42
Добавлено через 19 секунд
hoggy,Ясно. Но это не будет компилироваться не в gcc, не потому что все остальное не полностью соответствует стандартам, а потому что у gcc'шников местами включены нестандартные фишки. Я пробовал с С++17, C++14 (В онлайн компиляторах)
castaway
Эксперт С++
4848 / 2987 / 368
Регистрация: 10.11.2010
Сообщений: 11,028
Записей в блоге: 10
Завершенные тесты: 1
11.10.2015, 22:01     Неясности в теории #43
Цитата Сообщение от hoggy Посмотреть сообщение
я не удивлен.
А я не удивлён в том, что так и не было доказано что указатель хранит размер массива.
Rius
 Аватар для Rius
1763 / 1148 / 274
Регистрация: 25.05.2015
Сообщений: 4,075
Записей в блоге: 4
Завершенные тесты: 4
11.10.2015, 22:06     Неясности в теории #44
Цитата Сообщение от castaway Посмотреть сообщение
Давай вернёмся к старым временам:
Давайте:
Цитата Сообщение от castaway Посмотреть сообщение
Можете привести пример того, как передать все 100500 значений массива в функцию?
В #19 пример того, как передать массив по значению.

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

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

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

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

Добавлено через 3 минуты
Цитата Сообщение от hoggy Посмотреть сообщение
то есть, код из #41 вы проигнорировали.
ну-ну.
С чего бы? Там фигурирует указатель на массив, размер которого хранит сам массив, а не указатель на него.
hoggy
5230 / 2121 / 404
Регистрация: 15.11.2014
Сообщений: 4,812
Завершенные тесты: 1
11.10.2015, 22:16     Неясности в теории #47
Цитата Сообщение от castaway Посмотреть сообщение
Там фигурирует указатель на массив, размер которого хранит сам массив, а не указатель на него.
вам стоит подучить с++.

там фигурирует "указатель на массив".
не больше, и не меньше.
castaway
Эксперт С++
4848 / 2987 / 368
Регистрация: 10.11.2010
Сообщений: 11,028
Записей в блоге: 10
Завершенные тесты: 1
11.10.2015, 22:17     Неясности в теории #48
Цитата Сообщение от hoggy Посмотреть сообщение
там фигурирует "указатель на массив".
А я что сказал?
Rius
 Аватар для Rius
1763 / 1148 / 274
Регистрация: 25.05.2015
Сообщений: 4,075
Записей в блоге: 4
Завершенные тесты: 4
11.10.2015, 22:20     Неясности в теории #49
Цитата Сообщение от castaway Посмотреть сообщение
Нет. В 19-м сообщении пример передачи структуры, а не массива.
Да. Но, в то же время, это способ передачи массива по значению. Когда "если очень хочется, то можно".
castaway
Эксперт С++
4848 / 2987 / 368
Регистрация: 10.11.2010
Сообщений: 11,028
Записей в блоге: 10
Завершенные тесты: 1
11.10.2015, 22:25     Неясности в теории #50
Цитата Сообщение от Rius Посмотреть сообщение
Да. Но, в то же время, это способ передачи массива по значению. Когда "если очень хочется, то можно".
Это понятно, но всё это - отхождение от изначального вопроса. Из вопроса ТС понятно что он имел в виду не такой способ.
Rius
 Аватар для Rius
1763 / 1148 / 274
Регистрация: 25.05.2015
Сообщений: 4,075
Записей в блоге: 4
Завершенные тесты: 4
11.10.2015, 22:35     Неясности в теории #51
Согласен. Смысл моего первого ответа - передавайте по указателю, чтобы не транжирить ресурсы. И пишите одинаково, чтоб было понятно. Про ресурсы к массивам не относится, частный случай. Но вопрос был - почему чаще пишут int *x, а не то же это самое что просто массив, или нет.
hoggy
5230 / 2121 / 404
Регистрация: 15.11.2014
Сообщений: 4,812
Завершенные тесты: 1
11.10.2015, 22:39     Неясности в теории #52
Цитата Сообщение от castaway Посмотреть сообщение
А я что сказал?
Цитата Сообщение от castaway Посмотреть сообщение
С чего бы? Там фигурирует указатель на массив, размер которого хранит сам массив, а не указатель на него.

111111
castaway
Эксперт С++
4848 / 2987 / 368
Регистрация: 10.11.2010
Сообщений: 11,028
Записей в блоге: 10
Завершенные тесты: 1
11.10.2015, 22:41     Неясности в теории #53
Цитата Сообщение от Rius Посмотреть сообщение
Но вопрос был - почему чаще пишут int *x, а не то же это самое что просто массив, или нет.
Исходя из вопроса ТС я представляю два варианта:
C++
1
2
void foo( int * p ) { ... }
void foo( int p[10] ) { ... }
Rius
 Аватар для Rius
1763 / 1148 / 274
Регистрация: 25.05.2015
Сообщений: 4,075
Записей в блоге: 4
Завершенные тесты: 4
12.10.2015, 07:25     Неясности в теории #54
Да. Только эти два равнозначных варианта не объясняют, почему ТС-у кажется более частым применение первого варианта.
gru74ik
Модератор
 Аватар для gru74ik
3122 / 1348 / 167
Регистрация: 20.02.2013
Сообщений: 3,866
Записей в блоге: 18
12.10.2015, 07:55     Неясности в теории #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
mporro
256 / 102 / 14
Регистрация: 04.07.2014
Сообщений: 571
12.10.2015, 10:08     Неясности в теории #56
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 ничего придумать не получиться, нет возможности скопировать массив, можно только передать адрес на память, где массив хранится. То есть, возникнет необходимость выполнить вручную копирование массива во внешнем контексте, а затем всё равно передавать адрес в функцию.
Rius
 Аватар для Rius
1763 / 1148 / 274
Регистрация: 25.05.2015
Сообщений: 4,075
Записей в блоге: 4
Завершенные тесты: 4
12.10.2015, 10:26     Неясности в теории #57
Так чтоли?
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;
}
В функцию передаётся копия массива. В виде структуры, но всё-таки не вручную сделанная копия.
gru74ik
Модератор
 Аватар для gru74ik
3122 / 1348 / 167
Регистрация: 20.02.2013
Сообщений: 3,866
Записей в блоге: 18
12.10.2015, 11:21     Неясности в теории #58
Цитата Сообщение от Benzema Посмотреть сообщение
Здравствуйте! Объясните пожалуйста почему в параметрах функции чаще всего используют указатель на массив, а не сам массив, например, void display(int *num).
Потому что в С++ обычные сишные массивы не являются объектами первого класса (first class citizen). И поэтому их нельзя передать в функцию как некую единую сущность. Поэтому в функцию передают указатель на первый элемент массива и размер массива (чаще всего как целочисленную переменную), либо передают два указателя - на начало и конец массива.
Если нет желания передавать массив при помощи указателей, то можно сделать обёртку - завернуть массив в структуру или в класс. И передавать массив в функцию уже как экземпляр класса.
Либо пользоваться средствами нового стандарта (C++14), как это сделал hoggy (передавать ссылку или указатель и использовать ключевое слово auto).
mporro
256 / 102 / 14
Регистрация: 04.07.2014
Сообщений: 571
12.10.2015, 11:27     Неясности в теории #59
Rius
Нет, это не то. Вы передали в функцию структуру, совершенно иной объект. Структура действительно скопируется, но это уже данные, определённые пользователем.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
12.10.2015, 11:36     Неясности в теории
Еще ссылки по теме:

Некоторые неясности с задачей C++
Некоторые неясности с задачей C++
непонятность по теории C++

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

Или воспользуйтесь поиском по форуму:
gru74ik
Модератор
 Аватар для gru74ik
3122 / 1348 / 167
Регистрация: 20.02.2013
Сообщений: 3,866
Записей в блоге: 18
12.10.2015, 11:36     Неясности в теории #60
hoggy, а заполнить массив новыми значениями в такой же манере получится?
Yandex
Объявления
12.10.2015, 11:36     Неясности в теории
Ответ Создать тему
Опции темы

Текущее время: 05:40. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru