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

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

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

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

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

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

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

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

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

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

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

вопросы по теории - C++
помогите ответить на вопросы по теории!! Тема - СТРУКТУРЫ 1) способы обьявления струкутрных переменных. Динамическое выделение...

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Redzep
197 / 133 / 54
Регистрация: 21.12.2014
Сообщений: 369
11.10.2015, 19:57     Неясности в теории #2
Цитата Сообщение от Benzema Посмотреть сообщение
но вот для чего там знак %
Это остаток от деления. Например 42%5 находит остаток от деления 42 на 5.
Rius
Эксперт .NET
2410 / 1604 / 370
Регистрация: 25.05.2015
Сообщений: 5,443
Записей в блоге: 8
Завершенные тесты: 4
11.10.2015, 19:57     Неясности в теории #3
Указатель это 32 или 64-битное число всего лишь. Передать его менее накладно, т.е. быстрее, чем все значения массива в 100500 элементов.
% это получение остатка от деления.
Benzema
0 / 0 / 0
Регистрация: 29.03.2015
Сообщений: 58
11.10.2015, 20:00  [ТС]     Неясности в теории #4
Цитата Сообщение от Redzep Посмотреть сообщение
Это остаток от деления. Например 42%5 находит остаток от деления 42 на 5.
получается я здесь делю 1999 на 999? Прощу прощения, за тупой вопрос, но зачем? именно это я не понимаю
castaway
Эксперт С++
4881 / 3017 / 370
Регистрация: 10.11.2010
Сообщений: 11,076
Записей в блоге: 10
Завершенные тесты: 1
11.10.2015, 20:04     Неясности в теории #5
Цитата Сообщение от Rius Посмотреть сообщение
Указатель это 32 или 64-битное число всего лишь. Передать его менее накладно, т.е. быстрее, чем все значения массива в 100500 элементов.
Можете привести пример того, как передать все 100500 значений массива в функцию?
UnknownSoldier
569 / 90 / 36
Регистрация: 08.04.2015
Сообщений: 201
11.10.2015, 20:05     Неясности в теории #6
Сообщение было отмечено автором темы, экспертом или модератором как ответ
rand() может вернуть большое число, rand()%1999 гарантирует, что результат будет 0..1998. Сооветственно, rand()%1999-999 даст случайное число, которое гарантированно лежит в интервале -1000<x<1000.
Rius
Эксперт .NET
2410 / 1604 / 370
Регистрация: 25.05.2015
Сообщений: 5,443
Записей в блоге: 8
Завершенные тесты: 4
11.10.2015, 20:07     Неясности в теории #7
castaway, нет, конечно. Это же фантастика.
castaway
Эксперт С++
4881 / 3017 / 370
Регистрация: 10.11.2010
Сообщений: 11,076
Записей в блоге: 10
Завершенные тесты: 1
11.10.2015, 20:10     Неясности в теории #8
Цитата Сообщение от Benzema Посмотреть сообщение
Здравствуйте! Объясните пожалуйста почему в параметрах функции чаще всего используют указатель на массив, а не сам массив, например, void display(int *num).
Привет.
Обычно вместе с указателем на массив передают и его размер.
Как ты представляешь себе передачу массива (не указателя на него)?

Добавлено через 1 минуту
Цитата Сообщение от Rius Посмотреть сообщение
castaway, нет, конечно. Это же фантастика.
А зачем тогда отвечать в фантастическом (невозможном) стиле?
Benzema
0 / 0 / 0
Регистрация: 29.03.2015
Сообщений: 58
11.10.2015, 20:14  [ТС]     Неясности в теории #9
Цитата Сообщение от castaway Посмотреть сообщение
Привет.
Обычно вместе с указателем на массив передают и его размер.
Как ты представляешь себе передачу массива (не указателя на него)?

Добавлено через 1 минуту
А зачем тогда отвечать в фантастическом (невозможном) стиле?
Я представляю это как-будто его целиком передают, то есть все значения. Неправильно,я думаю,да?
Rius
Эксперт .NET
2410 / 1604 / 370
Регистрация: 25.05.2015
Сообщений: 5,443
Записей в блоге: 8
Завершенные тесты: 4
11.10.2015, 20:16     Неясности в теории #10
Цитата Сообщение от Benzema Посмотреть сообщение
Я представляю это как-будто его целиком передают, то есть все значения. Неправильно,я думаю,да?
Нет, лишь адрес начального элемента.
Но запомнить проще, указатель есть указатель.
hoggy
6437 / 2655 / 460
Регистрация: 15.11.2014
Сообщений: 5,844
Завершенные тесты: 1
11.10.2015, 20:16     Неясности в теории #11
Цитата Сообщение от castaway Посмотреть сообщение
Можете привести пример того, как передать все 100500 значений массива в функцию?
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include <iostream>
 
void view(auto& a)
{
    for(const auto& i: a)
        std::cout<< i<<", ";
    std::cout<<'\n';
}
 
int main()
{
    std::cout << "Hello, world!\n";
    
    const int a[] {1,2,3};
    
    view (a);
}
castaway
Эксперт С++
4881 / 3017 / 370
Регистрация: 10.11.2010
Сообщений: 11,076
Записей в блоге: 10
Завершенные тесты: 1
11.10.2015, 20:24     Неясности в теории #12
hoggy, тут просто передаётся ссылка на массив.

Добавлено через 1 минуту
Цитата Сообщение от Benzema Посмотреть сообщение
Неправильно,я думаю,да?
Да. Передаётся лишь адрес.
Rius
Эксперт .NET
2410 / 1604 / 370
Регистрация: 25.05.2015
Сообщений: 5,443
Записей в блоге: 8
Завершенные тесты: 4
11.10.2015, 20:36     Неясности в теории #13
Как же работает это?
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
#include "stdafx.h"
#include <stdint.h>
 
typedef struct
{
    int array[100500];
} tSt;
 
void func1(tSt a)
{
    printf("func1 by value \n");
    printf("address of argument: %p\n", &a);
    printf("data[0]: %d\n", a.array[0]);
    printf("data[1]: %d\n", a.array[1]);
 
    a.array[0] = 500;
    a.array[1] = 501;
 
    printf("data[0]: %d\n", a.array[0]);
    printf("data[1]: %d\n", a.array[1]);
}
 
void func2(tSt *a)
{
    printf("func2 by address \n");
    printf("address of argument: %p\n", a);
    printf("data[0]: %d\n", a->array[0]);
    printf("data[1]: %d\n", a->array[1]);
 
    a->array[0] = 600;
    a->array[1] = 601;
 
    printf("data[0]: %d\n", a->array[0]);
    printf("data[1]: %d\n", a->array[1]);
}
 
int _tmain(int argc, _TCHAR* argv[])
{
    tSt data;
    
    for (int i = 0; i < 100500; i++) {
        data.array[i] = i;
    }
 
    printf("Initialized:\n");
    printf("data[0]: %d\n", data.array[0]);
    printf("data[1]: %d\n", data.array[1]);
    printf("address of data: %p\n", &data);
 
    func1(data);
 
    printf("After func1 by value:\n");
    printf("data[0]: %d\n", data.array[0]);
    printf("data[1]: %d\n", data.array[1]);
    printf("address of data: %p\n", &data);
 
    func2(&data);
 
    printf("After func2 by address:\n");
    printf("data[0]: %d\n", data.array[0]);
    printf("data[1]: %d\n", data.array[1]);
    printf("address of data: %p\n", &data);
    return 0;
}
Bash
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
Initialized:
data[0]: 0
data[1]: 1
address of data: 001FD5F8
func1 by value
address of argument: 0019B2CC
data[0]: 0
data[1]: 1
data[0]: 500
data[1]: 501
After func1 by value:
data[0]: 0
data[1]: 1
address of data: 001FD5F8
func2 by address
address of argument: 001FD5F8
data[0]: 0
data[1]: 1
data[0]: 600
data[1]: 601
After func2 by address:
data[0]: 600
data[1]: 601
address of data: 001FD5F8
hoggy
6437 / 2655 / 460
Регистрация: 15.11.2014
Сообщений: 5,844
Завершенные тесты: 1
11.10.2015, 20:41     Неясности в теории #14
Цитата Сообщение от castaway Посмотреть сообщение
Обычно вместе с указателем на массив передают и его размер.
Как ты представляешь себе передачу массива (не указателя на него)?
Цитата Сообщение от castaway Посмотреть сообщение
тут просто передаётся ссылка на массив.

не обязательно передавать именно указатель на массив.
и совсем не обязательно передавать размер массива.

(указатель на массив так же, как и ссылка на массив помнит размерности)
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
11.10.2015, 20:55     Неясности в теории
Еще ссылки по теме:

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
castaway
Эксперт С++
4881 / 3017 / 370
Регистрация: 10.11.2010
Сообщений: 11,076
Записей в блоге: 10
Завершенные тесты: 1
11.10.2015, 20:55     Неясности в теории #15
Цитата Сообщение от Rius Посмотреть сообщение
Как же работает это?
Не переводи тему.
Цитата Сообщение от Rius Посмотреть сообщение
Указатель это 32 или 64-битное число всего лишь. Передать его менее накладно, т.е. быстрее, чем все значения массива в 100500 элементов.
Под передачей 100500 значений массива ты явно подразумеваешь копирование.

Добавлено через 2 минуты
Цитата Сообщение от hoggy Посмотреть сообщение
и совсем не обязательно передавать размер массива.
Разве я где-то упомянул слово "обязательно"?

Цитата Сообщение от hoggy Посмотреть сообщение
не обязательно передавать именно указатель на массив.
Я не говорил что обязательно передавать именно указатель на массив.

Добавлено через 1 минуту
Цитата Сообщение от hoggy Посмотреть сообщение
(указатель на массив так же, как и ссылка на массив помнит размерности)
Интересно. Можно пример с указателем?
Yandex
Объявления
11.10.2015, 20:55     Неясности в теории
Ответ Создать тему
Опции темы

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