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

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

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

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

11.10.2015, 19:55. Просмотров 992. Ответов 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
hoggy
6642 / 2828 / 485
Регистрация: 15.11.2014
Сообщений: 6,253
Завершенные тесты: 1
11.10.2015, 20:56 #16
Цитата Сообщение от castaway Посмотреть сообщение
Разве я где-то упомянул слово "обязательно"?
Цитата Сообщение от castaway Посмотреть сообщение
Я не говорил что обязательно передавать именно указатель на массив.
вы задали вопрос:

Цитата Сообщение от castaway Посмотреть сообщение
Как ты представляешь себе передачу массива (не указателя на него)?
вы получили ответ.
0
castaway
Эксперт С++
4884 / 3019 / 370
Регистрация: 10.11.2010
Сообщений: 11,078
Записей в блоге: 10
Завершенные тесты: 1
11.10.2015, 20:59 #17
Цитата Сообщение от hoggy Посмотреть сообщение
вы получили ответ.
Нет. Я не получил ответ.
0
hoggy
6642 / 2828 / 485
Регистрация: 15.11.2014
Сообщений: 6,253
Завершенные тесты: 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 Посмотреть сообщение
Нет. Я не получил ответ.
то есть, вы не представляете себе как можно передать массив
не через указатель, и не указывая его размерность?

невзирая на примеры-иллюстрации, как это можно обеспечить?
0
Rius
Эксперт .NET
2716 / 1837 / 417
Регистрация: 25.05.2015
Сообщений: 6,069
Записей в блоге: 8
Завершенные тесты: 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 видно, что значения по указанным адресам сбросились на значения исходного массива. Т.е., я предполагаю, скопировались. Или компилятор может провернуть такое без копирования?
0
castaway
Эксперт С++
4884 / 3019 / 370
Регистрация: 10.11.2010
Сообщений: 11,078
Записей в блоге: 10
Завершенные тесты: 1
11.10.2015, 21:10 #20
Цитата Сообщение от hoggy Посмотреть сообщение
(указатель на массив так же, как и ссылка на массив помнит размерности)
Цитата Сообщение от castaway Посмотреть сообщение
Интересно. Можно пример с указателем?
Цитата Сообщение от hoggy Посмотреть сообщение
пожалуйста:
Давай без auto. Чтобы убедится в том, что именно указатель помнит размерности.

Добавлено через 1 минуту
Цитата Сообщение от Rius Посмотреть сообщение
castaway, ок!
"ok!" что? По правилам хорошего тона принято цитировать вопрос.
0
Rius
Эксперт .NET
2716 / 1837 / 417
Регистрация: 25.05.2015
Сообщений: 6,069
Записей в блоге: 8
Завершенные тесты: 4
11.10.2015, 21:14 #21
castaway, я уточнил вопрос в посте 19.
Если уж говорить о правилах хорошего тона, то и на ТЫ обращаться к незнакомым не принято. И оверквотить тоже.
0
hoggy
6642 / 2828 / 485
Регистрация: 15.11.2014
Сообщений: 6,253
Завершенные тесты: 1
11.10.2015, 21:15 #22
Цитата Сообщение от castaway Посмотреть сообщение
Давай без auto. Чтобы убедится в том, что именно указатель помнит размерности.
auto* не может быть ничем иным, кроме указателя.
здесь нечему убеждаться.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include <iostream>
 
template<class T, size_t N>
void view(const T (*p)[N])
{
    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);
}
0
castaway
Эксперт С++
4884 / 3019 / 370
Регистрация: 10.11.2010
Сообщений: 11,078
Записей в блоге: 10
Завершенные тесты: 1
11.10.2015, 21:16 #23
Цитата Сообщение от hoggy Посмотреть сообщение
то есть, вы не представляете себе как можно передать массив
не через указатель, и не указывая его размерность?
Я знаю как это сделать, но речь не об этом.
0
hoggy
6642 / 2828 / 485
Регистрация: 15.11.2014
Сообщений: 6,253
Завершенные тесты: 1
11.10.2015, 21:17 #24
Цитата Сообщение от Rius Посмотреть сообщение
оверквотить
простите, что означает слово "оверквотить" ?

гугл подсказал спросить у лурка, но лурк забаннен.
остальные найденные упоминания не содержат определений.
0
daslex
1271 / 515 / 106
Регистрация: 02.08.2011
Сообщений: 2,706
11.10.2015, 21:18 #25
Цитата Сообщение от castaway Посмотреть сообщение
Давай без auto
А пусть с auto на clang попробует.

Это не по стандарту.
Auto как аргумент функции
0
Rius
11.10.2015, 21:19
  #26

Не по теме:

hoggy, много цитат
Вообще, вот так (в спойлере):

Кликните здесь для просмотра всего текста
1
2
3
4
5
6

0
hoggy
6642 / 2828 / 485
Регистрация: 15.11.2014
Сообщений: 6,253
Завершенные тесты: 1
11.10.2015, 21:22 #27
Цитата Сообщение от castaway Посмотреть сообщение
Я знаю как это сделать, но речь не об этом.
вы спросили как передать массив не через указатель,
вам были даны ответы с примерами-иллюстрациями.

вы заявили, что это не есть ответ на ваш вопрос.

тут одно из двух:
1.
вы задали не тот вопрос.
не смогли сформулировать свой вопрос правильно,
и получили ответ не тот вопрос, на который хотелось.

2.
вы просто гоните какую то пургу.
зная ваш скандальный характер и не способность признавать ошибки,
я не удивлюсь развитию второго варианта.
0
castaway
Эксперт С++
4884 / 3019 / 370
Регистрация: 10.11.2010
Сообщений: 11,078
Записей в блоге: 10
Завершенные тесты: 1
11.10.2015, 21:23 #28
Цитата Сообщение от hoggy Посмотреть сообщение
auto* не может быть ничем иным, кроме указателя.
здесь нечему убеждаться.
Да что ж ты такой скользкий как понос... Читай с 3-го сообщения.

Цитата Сообщение от Rius Посмотреть сообщение
castaway, я уточнил вопрос в посте 19.
Если уж говорить о правилах хорошего тона, то и на ТЫ обращаться к незнакомым не принято. И оверквотить тоже.
Давай вернёмся к старым временам:
Цитата Сообщение от Benzema Посмотреть сообщение
почему в параметрах функции чаще всего используют указатель на массив, а не сам массив
Цитата Сообщение от Rius Посмотреть сообщение
Указатель это 32 или 64-битное число всего лишь. Передать его менее накладно, т.е. быстрее, чем все значения массива в 100500 элементов.
Первый случай я себе представляю. Ты можешь привести пример того, как выглядит второй?
0
hoggy
6642 / 2828 / 485
Регистрация: 15.11.2014
Сообщений: 6,253
Завершенные тесты: 1
11.10.2015, 21:23 #29
Цитата Сообщение от daslex Посмотреть сообщение
Это не по стандарту.
вы ошибаетесь.
см стандарт c++11y
0
castaway
Эксперт С++
4884 / 3019 / 370
Регистрация: 10.11.2010
Сообщений: 11,078
Записей в блоге: 10
Завершенные тесты: 1
11.10.2015, 21:30 #30
Цитата Сообщение от hoggy Посмотреть сообщение
вы спросили как передать массив не через указатель,
вам были даны ответы с примерами-иллюстрациями.
вы заявили, что это не есть ответ на ваш вопрос.
тут одно из двух:
1.
вы задали не тот вопрос.
не смогли сформулировать свой вопрос правильно,
и получили ответ не тот вопрос, на который хотелось.
2.
вы просто гоните какую то пургу.
зная ваш скандальный характер и не способность признавать ошибки,
я не удивлюсь развитию второго варианта.
То же самое, но только с моими цитатами можно?

Добавлено через 4 минуты
hoggy, в твоём примере размерность помнит ссылка, а не указатель.
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
11.10.2015, 21:30
Привет! Вот еще темы с ответами:

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

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

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

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


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

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

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