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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Benzema
0 / 0 / 0
Регистрация: 29.03.2015
Сообщений: 58
#1

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

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

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

Некоторые неясности с задачей - C++
Имеется задача: вырезано Имеется ее решение: #include <stdio.h> #include <iostream> typedef int *B; int main () ...

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

Некоторые неясности с задачей - C++
Имеется задача: вырезано Имеется ее решение: #include <stdio.h> #include <iostream> int main () { ...

Неясности в реализации метода Адамса - C++
Добрый вечер, форумчане. Я кажется запутался в реализации этого метода. Скажем порядок метода - 4. Есть: // правые части...

Подсчёт выражения. Разработка программы и неясности с функцией pow - C++
Привет, друзья. Задали задачку вот такую: http://habreffect.ru/files/808/bdadc49dd/DSC08284.jpg Собственно говоря программу я написал...

немного теории - C++
Очень долго искал в инете определение методу Итерации чтоб так сказать было разжеванно но не нашел кто поможет дать ему определение на...

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

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

там фигурирует "указатель на массив".
не больше, и не меньше.
0
castaway
Эксперт С++
4884 / 3019 / 370
Регистрация: 10.11.2010
Сообщений: 11,078
Записей в блоге: 10
Завершенные тесты: 1
11.10.2015, 22:17 #48
Цитата Сообщение от hoggy Посмотреть сообщение
там фигурирует "указатель на массив".
А я что сказал?
0
Rius
Эксперт .NET
2724 / 1846 / 417
Регистрация: 25.05.2015
Сообщений: 6,083
Записей в блоге: 8
Завершенные тесты: 4
11.10.2015, 22:20 #49
Цитата Сообщение от castaway Посмотреть сообщение
Нет. В 19-м сообщении пример передачи структуры, а не массива.
Да. Но, в то же время, это способ передачи массива по значению. Когда "если очень хочется, то можно".
0
castaway
Эксперт С++
4884 / 3019 / 370
Регистрация: 10.11.2010
Сообщений: 11,078
Записей в блоге: 10
Завершенные тесты: 1
11.10.2015, 22:25 #50
Цитата Сообщение от Rius Посмотреть сообщение
Да. Но, в то же время, это способ передачи массива по значению. Когда "если очень хочется, то можно".
Это понятно, но всё это - отхождение от изначального вопроса. Из вопроса ТС понятно что он имел в виду не такой способ.
0
Rius
Эксперт .NET
2724 / 1846 / 417
Регистрация: 25.05.2015
Сообщений: 6,083
Записей в блоге: 8
Завершенные тесты: 4
11.10.2015, 22:35 #51
Согласен. Смысл моего первого ответа - передавайте по указателю, чтобы не транжирить ресурсы. И пишите одинаково, чтоб было понятно. Про ресурсы к массивам не относится, частный случай. Но вопрос был - почему чаще пишут int *x, а не то же это самое что просто массив, или нет.
0
hoggy
6653 / 2841 / 486
Регистрация: 15.11.2014
Сообщений: 6,286
Завершенные тесты: 1
11.10.2015, 22:39 #52
Цитата Сообщение от castaway Посмотреть сообщение
А я что сказал?
Цитата Сообщение от castaway Посмотреть сообщение
С чего бы? Там фигурирует указатель на массив, размер которого хранит сам массив, а не указатель на него.

111111
0
castaway
Эксперт С++
4884 / 3019 / 370
Регистрация: 10.11.2010
Сообщений: 11,078
Записей в блоге: 10
Завершенные тесты: 1
11.10.2015, 22:41 #53
Цитата Сообщение от Rius Посмотреть сообщение
Но вопрос был - почему чаще пишут int *x, а не то же это самое что просто массив, или нет.
Исходя из вопроса ТС я представляю два варианта:
C++
1
2
void foo( int * p ) { ... }
void foo( int p[10] ) { ... }
0
Rius
Эксперт .NET
2724 / 1846 / 417
Регистрация: 25.05.2015
Сообщений: 6,083
Записей в блоге: 8
Завершенные тесты: 4
12.10.2015, 07:25 #54
Да. Только эти два равнозначных варианта не объясняют, почему ТС-у кажется более частым применение первого варианта.
0
gru74ik
Модератор
Эксперт CЭксперт С++
4169 / 1817 / 198
Регистрация: 20.02.2013
Сообщений: 4,958
Записей в блоге: 21
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
0
mporro
256 / 101 / 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 ничего придумать не получиться, нет возможности скопировать массив, можно только передать адрес на память, где массив хранится. То есть, возникнет необходимость выполнить вручную копирование массива во внешнем контексте, а затем всё равно передавать адрес в функцию.
0
Rius
Эксперт .NET
2724 / 1846 / 417
Регистрация: 25.05.2015
Сообщений: 6,083
Записей в блоге: 8
Завершенные тесты: 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;
}
В функцию передаётся копия массива. В виде структуры, но всё-таки не вручную сделанная копия.
0
gru74ik
Модератор
Эксперт CЭксперт С++
4169 / 1817 / 198
Регистрация: 20.02.2013
Сообщений: 4,958
Записей в блоге: 21
12.10.2015, 11:21 #58
Цитата Сообщение от Benzema Посмотреть сообщение
Здравствуйте! Объясните пожалуйста почему в параметрах функции чаще всего используют указатель на массив, а не сам массив, например, void display(int *num).
Потому что в С++ обычные сишные массивы не являются объектами первого класса (first class citizen). И поэтому их нельзя передать в функцию как некую единую сущность. Поэтому в функцию передают указатель на первый элемент массива и размер массива (чаще всего как целочисленную переменную), либо передают два указателя - на начало и конец массива.
Если нет желания передавать массив при помощи указателей, то можно сделать обёртку - завернуть массив в структуру или в класс. И передавать массив в функцию уже как экземпляр класса.
Либо пользоваться средствами нового стандарта (C++14), как это сделал hoggy (передавать ссылку или указатель и использовать ключевое слово auto).
1
mporro
256 / 101 / 14
Регистрация: 04.07.2014
Сообщений: 571
12.10.2015, 11:27 #59
Rius
Нет, это не то. Вы передали в функцию структуру, совершенно иной объект. Структура действительно скопируется, но это уже данные, определённые пользователем.
1
gru74ik
Модератор
Эксперт CЭксперт С++
4169 / 1817 / 198
Регистрация: 20.02.2013
Сообщений: 4,958
Записей в блоге: 21
12.10.2015, 11:36 #60
hoggy, а заполнить массив новыми значениями в такой же манере получится?
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
12.10.2015, 11:36
Привет! Вот еще темы с ответами:

Вопросы по теории - C++
Здравствуйте, уважаемые участники форума. Начинаю изучать программирование и язык C++ в частности. И сразу же появились вопросы,...

непонятность по теории - C++
что означает статическая переменная? она как локальная только не стирается после окончания функции? или как?

Немного теории - C++
Доброго дня, форумчане! Пишу курсач на тему Системы программирования. Препод сказал, что у меня нет информации о видах систем...

Вопросы по теории C++ - C++
Есть несколько вопросов по теории C++ 1)Что такое функция пользователя 2)Как инициализировать указатель Если можно , то без всяких...


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

Или воспользуйтесь поиском по форуму:
60
Yandex
Объявления
12.10.2015, 11:36
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru