Форум программистов, компьютерный форум 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++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Redzep
170 / 106 / 42
Регистрация: 21.12.2014
Сообщений: 312
11.10.2015, 19:57     Неясности в теории #2
Цитата Сообщение от Benzema Посмотреть сообщение
но вот для чего там знак %
Это остаток от деления. Например 42%5 находит остаток от деления 42 на 5.
Rius
 Аватар для Rius
1764 / 1149 / 274
Регистрация: 25.05.2015
Сообщений: 4,077
Записей в блоге: 4
Завершенные тесты: 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
Эксперт С++
4848 / 2987 / 368
Регистрация: 10.11.2010
Сообщений: 11,028
Записей в блоге: 10
Завершенные тесты: 1
11.10.2015, 20:04     Неясности в теории #5
Цитата Сообщение от Rius Посмотреть сообщение
Указатель это 32 или 64-битное число всего лишь. Передать его менее накладно, т.е. быстрее, чем все значения массива в 100500 элементов.
Можете привести пример того, как передать все 100500 значений массива в функцию?
UnknownSoldier
567 / 88 / 35
Регистрация: 08.04.2015
Сообщений: 187
11.10.2015, 20:05     Неясности в теории #6
Сообщение было отмечено автором темы, экспертом или модератором как ответ
rand() может вернуть большое число, rand()%1999 гарантирует, что результат будет 0..1998. Сооветственно, rand()%1999-999 даст случайное число, которое гарантированно лежит в интервале -1000<x<1000.
Rius
 Аватар для Rius
1764 / 1149 / 274
Регистрация: 25.05.2015
Сообщений: 4,077
Записей в блоге: 4
Завершенные тесты: 4
11.10.2015, 20:07     Неясности в теории #7
castaway, нет, конечно. Это же фантастика.
castaway
Эксперт С++
4848 / 2987 / 368
Регистрация: 10.11.2010
Сообщений: 11,028
Записей в блоге: 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
 Аватар для Rius
1764 / 1149 / 274
Регистрация: 25.05.2015
Сообщений: 4,077
Записей в блоге: 4
Завершенные тесты: 4
11.10.2015, 20:16     Неясности в теории #10
Цитата Сообщение от Benzema Посмотреть сообщение
Я представляю это как-будто его целиком передают, то есть все значения. Неправильно,я думаю,да?
Нет, лишь адрес начального элемента.
Но запомнить проще, указатель есть указатель.
hoggy
5230 / 2121 / 404
Регистрация: 15.11.2014
Сообщений: 4,812
Завершенные тесты: 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
Эксперт С++
4848 / 2987 / 368
Регистрация: 10.11.2010
Сообщений: 11,028
Записей в блоге: 10
Завершенные тесты: 1
11.10.2015, 20:24     Неясности в теории #12
hoggy, тут просто передаётся ссылка на массив.

Добавлено через 1 минуту
Цитата Сообщение от Benzema Посмотреть сообщение
Неправильно,я думаю,да?
Да. Передаётся лишь адрес.
Rius
 Аватар для Rius
1764 / 1149 / 274
Регистрация: 25.05.2015
Сообщений: 4,077
Записей в блоге: 4
Завершенные тесты: 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
5230 / 2121 / 404
Регистрация: 15.11.2014
Сообщений: 4,812
Завершенные тесты: 1
11.10.2015, 20:41     Неясности в теории #14
Цитата Сообщение от castaway Посмотреть сообщение
Обычно вместе с указателем на массив передают и его размер.
Как ты представляешь себе передачу массива (не указателя на него)?
Цитата Сообщение от castaway Посмотреть сообщение
тут просто передаётся ссылка на массив.

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

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

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

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

Добавлено через 1 минуту
Цитата Сообщение от hoggy Посмотреть сообщение
(указатель на массив так же, как и ссылка на массив помнит размерности)
Интересно. Можно пример с указателем?
hoggy
5230 / 2121 / 404
Регистрация: 15.11.2014
Сообщений: 4,812
Завершенные тесты: 1
11.10.2015, 20:56     Неясности в теории #16
Цитата Сообщение от castaway Посмотреть сообщение
Разве я где-то упомянул слово "обязательно"?
Цитата Сообщение от castaway Посмотреть сообщение
Я не говорил что обязательно передавать именно указатель на массив.
вы задали вопрос:

Цитата Сообщение от castaway Посмотреть сообщение
Как ты представляешь себе передачу массива (не указателя на него)?
вы получили ответ.
castaway
Эксперт С++
4848 / 2987 / 368
Регистрация: 10.11.2010
Сообщений: 11,028
Записей в блоге: 10
Завершенные тесты: 1
11.10.2015, 20:59     Неясности в теории #17
Цитата Сообщение от hoggy Посмотреть сообщение
вы получили ответ.
Нет. Я не получил ответ.
hoggy
5230 / 2121 / 404
Регистрация: 15.11.2014
Сообщений: 4,812
Завершенные тесты: 1
11.10.2015, 21:03     Неясности в теории #18
Цитата Сообщение от castaway Посмотреть сообщение
Интересно. Можно пример с указателем?
пожалуйста:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include <iostream>
 
void view(const auto* p)
{
    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);
}
Добавлено через 1 минуту
Цитата Сообщение от castaway Посмотреть сообщение
Нет. Я не получил ответ.
то есть, вы не представляете себе как можно передать массив
не через указатель, и не указывая его размерность?

невзирая на примеры-иллюстрации, как это можно обеспечить?
Rius
 Аватар для Rius
1764 / 1149 / 274
Регистрация: 25.05.2015
Сообщений: 4,077
Записей в блоге: 4
Завершенные тесты: 4
11.10.2015, 21:07     Неясности в теории #19
castaway, ок!
Кликните здесь для просмотра всего текста
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
65
66
67
68
69
70
71
72
73
74
// ConsoleApplication1.cpp: определяет точку входа для консольного приложения.
//
 
#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);
 
    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;
}


Initialized:
data[0]: 0
data[1]: 1
address of data: 0022D5A4 - адрес исходного массива


func1 by value
address of argument: 001CB278 - адрес аргумента в функции
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: 0022D5A4 - адрес тоже

func1 by value
address of argument: 001CB278 - снова вызываем ту же функцию, адрес аргумента тот же
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: 0022D5A4
func2 by address
address of argument: 0022D5A4
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: 0022D5A4
Добавил в просмотре контрольных значений адрес аргумента 001CB278 (и +1 к нему).
В первом вызове функции func1 видно, что значения по начальным адресам изменились.
После выхода из первого вызова, там, по этим адресам (где это ?), значения остались.
В момент второго входа в функцию func1 видно, что значения по указанным адресам сбросились на значения исходного массива. Т.е., я предполагаю, скопировались. Или компилятор может провернуть такое без копирования?
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
11.10.2015, 21:10     Неясности в теории
Еще ссылки по теме:

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

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

Или воспользуйтесь поиском по форуму:
castaway
Эксперт С++
4848 / 2987 / 368
Регистрация: 10.11.2010
Сообщений: 11,028
Записей в блоге: 10
Завершенные тесты: 1
11.10.2015, 21:10     Неясности в теории #20
Цитата Сообщение от hoggy Посмотреть сообщение
(указатель на массив так же, как и ссылка на массив помнит размерности)
Цитата Сообщение от castaway Посмотреть сообщение
Интересно. Можно пример с указателем?
Цитата Сообщение от hoggy Посмотреть сообщение
пожалуйста:
Давай без auto. Чтобы убедится в том, что именно указатель помнит размерности.

Добавлено через 1 минуту
Цитата Сообщение от Rius Посмотреть сообщение
castaway, ок!
"ok!" что? По правилам хорошего тона принято цитировать вопрос.
Yandex
Объявления
11.10.2015, 21:10     Неясности в теории
Ответ Создать тему
Опции темы

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