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

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

11.10.2015, 19:55. Показов 3431. Ответов 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
202 / 138 / 88
Регистрация: 21.12.2014
Сообщений: 369
11.10.2015, 19:57
Цитата Сообщение от Benzema Посмотреть сообщение
но вот для чего там знак %
Это остаток от деления. Например 42%5 находит остаток от деления 42 на 5.
0
Эксперт .NET
 Аватар для Rius
13031 / 7598 / 1663
Регистрация: 25.05.2015
Сообщений: 23,140
Записей в блоге: 14
11.10.2015, 19:57
Указатель это 32 или 64-битное число всего лишь. Передать его менее накладно, т.е. быстрее, чем все значения массива в 100500 элементов.
% это получение остатка от деления.
0
0 / 0 / 0
Регистрация: 29.03.2015
Сообщений: 58
11.10.2015, 20:00  [ТС]
Цитата Сообщение от Redzep Посмотреть сообщение
Это остаток от деления. Например 42%5 находит остаток от деления 42 на 5.
получается я здесь делю 1999 на 999? Прощу прощения, за тупой вопрос, но зачем? именно это я не понимаю
0
Эксперт С++
4986 / 3093 / 456
Регистрация: 10.11.2010
Сообщений: 11,170
Записей в блоге: 10
11.10.2015, 20:04
Цитата Сообщение от Rius Посмотреть сообщение
Указатель это 32 или 64-битное число всего лишь. Передать его менее накладно, т.е. быстрее, чем все значения массива в 100500 элементов.
Можете привести пример того, как передать все 100500 значений массива в функцию?
2
653 / 161 / 64
Регистрация: 08.04.2015
Сообщений: 411
11.10.2015, 20:05
Лучший ответ Сообщение было отмечено Benzema как решение

Решение

rand() может вернуть большое число, rand()%1999 гарантирует, что результат будет 0..1998. Сооветственно, rand()%1999-999 даст случайное число, которое гарантированно лежит в интервале -1000<x<1000.
0
Эксперт .NET
 Аватар для Rius
13031 / 7598 / 1663
Регистрация: 25.05.2015
Сообщений: 23,140
Записей в блоге: 14
11.10.2015, 20:07
castaway, нет, конечно. Это же фантастика.
0
Эксперт С++
4986 / 3093 / 456
Регистрация: 10.11.2010
Сообщений: 11,170
Записей в блоге: 10
11.10.2015, 20:10
Цитата Сообщение от Benzema Посмотреть сообщение
Здравствуйте! Объясните пожалуйста почему в параметрах функции чаще всего используют указатель на массив, а не сам массив, например, void display(int *num).
Привет.
Обычно вместе с указателем на массив передают и его размер.
Как ты представляешь себе передачу массива (не указателя на него)?

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

Добавлено через 1 минуту
А зачем тогда отвечать в фантастическом (невозможном) стиле?
Я представляю это как-будто его целиком передают, то есть все значения. Неправильно,я думаю,да?
0
Эксперт .NET
 Аватар для Rius
13031 / 7598 / 1663
Регистрация: 25.05.2015
Сообщений: 23,140
Записей в блоге: 14
11.10.2015, 20:16
Цитата Сообщение от Benzema Посмотреть сообщение
Я представляю это как-будто его целиком передают, то есть все значения. Неправильно,я думаю,да?
Нет, лишь адрес начального элемента.
Но запомнить проще, указатель есть указатель.
0
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
11.10.2015, 20:16
Цитата Сообщение от 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);
}
0
Эксперт С++
4986 / 3093 / 456
Регистрация: 10.11.2010
Сообщений: 11,170
Записей в блоге: 10
11.10.2015, 20:24
hoggy, тут просто передаётся ссылка на массив.

Добавлено через 1 минуту
Цитата Сообщение от Benzema Посмотреть сообщение
Неправильно,я думаю,да?
Да. Передаётся лишь адрес.
0
Эксперт .NET
 Аватар для Rius
13031 / 7598 / 1663
Регистрация: 25.05.2015
Сообщений: 23,140
Записей в блоге: 14
11.10.2015, 20:36
Как же работает это?
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
0
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
11.10.2015, 20:41
Цитата Сообщение от castaway Посмотреть сообщение
Обычно вместе с указателем на массив передают и его размер.
Как ты представляешь себе передачу массива (не указателя на него)?
Цитата Сообщение от castaway Посмотреть сообщение
тут просто передаётся ссылка на массив.

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

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

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

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

Добавлено через 1 минуту
Цитата Сообщение от hoggy Посмотреть сообщение
(указатель на массив так же, как и ссылка на массив помнит размерности)
Интересно. Можно пример с указателем?
0
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
11.10.2015, 20:56
Цитата Сообщение от castaway Посмотреть сообщение
Разве я где-то упомянул слово "обязательно"?
Цитата Сообщение от castaway Посмотреть сообщение
Я не говорил что обязательно передавать именно указатель на массив.
вы задали вопрос:

Цитата Сообщение от castaway Посмотреть сообщение
Как ты представляешь себе передачу массива (не указателя на него)?
вы получили ответ.
0
Эксперт С++
4986 / 3093 / 456
Регистрация: 10.11.2010
Сообщений: 11,170
Записей в блоге: 10
11.10.2015, 20:59
Цитата Сообщение от hoggy Посмотреть сообщение
вы получили ответ.
Нет. Я не получил ответ.
0
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
11.10.2015, 21:03
Цитата Сообщение от 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 Посмотреть сообщение
Нет. Я не получил ответ.
то есть, вы не представляете себе как можно передать массив
не через указатель, и не указывая его размерность?

невзирая на примеры-иллюстрации, как это можно обеспечить?
0
Эксперт .NET
 Аватар для Rius
13031 / 7598 / 1663
Регистрация: 25.05.2015
Сообщений: 23,140
Записей в блоге: 14
11.10.2015, 21:07
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 видно, что значения по указанным адресам сбросились на значения исходного массива. Т.е., я предполагаю, скопировались. Или компилятор может провернуть такое без копирования?
0
Эксперт С++
4986 / 3093 / 456
Регистрация: 10.11.2010
Сообщений: 11,170
Записей в блоге: 10
11.10.2015, 21:10
Цитата Сообщение от hoggy Посмотреть сообщение
(указатель на массив так же, как и ссылка на массив помнит размерности)
Цитата Сообщение от castaway Посмотреть сообщение
Интересно. Можно пример с указателем?
Цитата Сообщение от hoggy Посмотреть сообщение
пожалуйста:
Давай без auto. Чтобы убедится в том, что именно указатель помнит размерности.

Добавлено через 1 минуту
Цитата Сообщение от Rius Посмотреть сообщение
castaway, ок!
"ok!" что? По правилам хорошего тона принято цитировать вопрос.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
11.10.2015, 21:10
Помогаю со студенческими работами здесь

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


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка. Рецензия / Мнение Это мой обзор планшета X220 с точки зрения школьника. Недавно я решила попытаться уменьшить свой. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru