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

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

Войти
Регистрация
Восстановить пароль
 
Alek70694
4 / 4 / 0
Регистрация: 27.10.2012
Сообщений: 247
#1

Почему после передачи в функцию массива, выводятся случайные числа, если использовать *(uk++) во второй раз? - C++

12.04.2016, 23:20. Просмотров 192. Ответов 7
Метки нет (Все метки)

Интересует такой вопрос: почему после передачи в функцию массива выводятся случайные числа из оперативной памяти, если использовать *(uk++) во второй раз?
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
#include <iostream>
using namespace std;
 
int main()
{
setlocale(LC_ALL,"RUS");
void function (int*);
int massiv[5] = {11, 12, 13, 14, 15};
int *uk;
uk = massiv;
for (int j = 0; j<5; j++)
{ cout <<  *(uk++) << " "; }
cout << endl;
function (massiv);
for (int j = 0; j<5; j++)
{ cout <<  *(massiv + j) << " "; }
// { cout <<  *(uk++) << " "; } - НЕ РАБОТАЕТ
cout << endl;
 
system("pause");
return 0;
}
 
void function (int * m)
{
    for (int j = 0; j<5; j++)
    { *m++ = *m *2; }
}
0
Лучшие ответы (1)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
12.04.2016, 23:20
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Почему после передачи в функцию массива, выводятся случайные числа, если использовать *(uk++) во второй раз? (C++):

Почему если использовать одну переменную в двух циклах, то последний элемент такой же как и второй? - PHP
Почему если использовать одну переменную в двух циклах, то последний элемент такой же как и второй? $numbers = array(100, 313, 605); ...

Организовать случайные числа для массива, если каждое вещественное число должно удовлетворять промежутку - C (СИ)
Как организовать случайные числа для массива, если каждое вещественное число должно удовлетворять промежутку [a,b), a и b вещественные числа

Повторяющиеся числа из первого массива занести во второй массив только один раз - C++
#include &lt;stdio.h&gt; #include &lt;iostream&gt; #include &lt;cstdlib&gt; using namespace std; int main(int argc, char* argv) { int...

Почему после 51-го знака после запятой выводятся одни нули? - C++
В продолжение темы: тот же код, только с увеличенным количеством знаков после запятой: #include &lt;iostream&gt; #include &lt;windows.h&gt;...

Дважды вычислить значение выражение, первый раз используя процедуру, а второй раз-функцию - Turbo Pascal
Может кто-нибудь сможет решить задачку!!! Дважды вычислить значение выражения, первый раз используя процедуру, а второй раз -функцию. ...

Если сумма сгенерированных чисел – положительная, то числа выводятся в левый ListBox. Если отрицательная – в правый - C#
Разработать Windows Forms приложение, содержащее 2 объекта ListBox и кнопку. По нажатию на кнопку генерируется 10 случайных чисел в...

7
Renji
2061 / 1418 / 320
Регистрация: 05.06.2014
Сообщений: 4,075
12.04.2016, 23:25 #2
Ну, во-первых, в 27 строчке ++ выполняется не там где он написан, а там, где скажет левая пятка компилятора. Порядок действий сохраняется только между точками следования (в нашем случае - начало/конец строчки), между ними разрешается творить любой треш и угар.
Во-вторых, 17 строчка не является частью цикла, потому как в цикл попадет лишь первая {} секция.
В-третьих, заключать в {} одну строчку не нужно, это не Перл.
1
Alek70694
4 / 4 / 0
Регистрация: 27.10.2012
Сообщений: 247
12.04.2016, 23:33  [ТС] #3
Цитата Сообщение от Renji Посмотреть сообщение
Ну, во-первых, в 27 строчке ++ выполняется не там где он написан, а там, где скажет левая пятка компилятора. Порядок действий сохраняется только между точками следования (в нашем случае - начало/конец строчки), между ними разрешается творить любой треш и угар.
Во-вторых, 17 строчка не является частью цикла, потому как в цикл попадет лишь первая {} секция.
В-третьих, заключать в {} одну строчку не нужно, это не Перл.
Не совсем понимаю первый ответ, как это не выполняется ++? А как же тогда код выполняется, по идее ведь увеличивается указатель, затем разыменовывается и дальше мы уже выполняем действия. А если бы написано было так, то правильнее было бы? :
C++
1
    { *m++ *= 2; }
Кстати говоря, 17 строчку я и не хотел в данном коде использовать(вместо него рабочую 16 строчку вписал), а только лишь показал сам код, который некорректно работает, поэтому и закоменчено.
А про скобки - больше так не буду)
0
Alek70694
4 / 4 / 0
Регистрация: 27.10.2012
Сообщений: 247
12.04.2016, 23:40  [ТС] #4
Вот, если так написать после 13 строчки, то выводят непонятные числа:
C++
1
2
3
function (massiv);
for (int j = 0; j<5; j++)
{ cout <<  *(uk++) << " "; }
Хочется понять, почему так происходит.
0
Миниатюры
Почему после передачи в функцию массива, выводятся случайные числа, если использовать *(uk++) во второй раз?  
Renji
2061 / 1418 / 320
Регистрация: 05.06.2014
Сообщений: 4,075
12.04.2016, 23:42 #5
Лучший ответ Сообщение было отмечено автором темы, экспертом или модератором как ответ
Цитата Сообщение от Alek70694 Посмотреть сообщение
Не совсем понимаю первый ответ, как это не выполняется ++? А как же тогда код выполняется, по идее ведь увеличивается указатель, затем разыменовывается и дальше мы уже выполняем действия.
Код выполняется так:
C++
1
2
3
int& temp=*m;
++m;
temp=*m*2;
Или вот так:
C++
1
2
3
int& temp=*m;
temp=*m*2;
++m;
Последние две строчки компилятор может переставить как ему захочется.
Цитата Сообщение от Alek70694 Посмотреть сообщение
Вот, если так написать после 13 строчки, то выводят непонятные числа:
Ну так к 13 строчке у вас uk уже уехал за границы массива.
1
Alek70694
4 / 4 / 0
Регистрация: 27.10.2012
Сообщений: 247
12.04.2016, 23:47  [ТС] #6
Цитата Сообщение от Renji Посмотреть сообщение
Ну так к 13 строчке у вас uk уже уехал за границы массива.
А как его к первоначальному виду привести? Только заново присвоить адрес массива?
0
Renji
2061 / 1418 / 320
Регистрация: 05.06.2014
Сообщений: 4,075
12.04.2016, 23:48 #7
Цитата Сообщение от Alek70694 Посмотреть сообщение
А как его к первоначальному виду привести? Только заново присвоить адрес массива?
Или заново присвоить, или написать uk-=5;.
1
MansMI
1305 / 1083 / 306
Регистрация: 08.01.2012
Сообщений: 4,143
13.04.2016, 00:04 #8
видимо чего то не понял в топике, но так работает
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
void f(int *p)
{
    for(int i=0; i<5; i++) *p++*=2;
}
void main(int argc,char* argv[])
{
    int a[]={1,2,3,4,5};
    int *p=a;
    for(int i=0; i<5; i++) cout<<p[i]<<" ";
    cout<<endl;
    f(p);
    for(int i=0; i<5; i++) cout<<p[i]<<" ";
    cout<<endl;
    system("pause");
1
13.04.2016, 00:04
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
13.04.2016, 00:04
Привет! Вот еще темы с ответами:

Как сгенерировать случайные числа в диапазоне от Ν до M, Z число раз - C++ Builder
Здравствуйте. Я пишу небольшую программку и в ней мне нужно сгенерировать случайные вещественные числа в определенном диапазоне (например...

Вывести массив, притом что одинаковые числа выводятся один раз - C++
Есть массив с некоторыми элементами и некоторые из них повторяются, нужно вывести этот массив, притом что одинаковые числа выводятся один...

Почему While не срабатывает второй раз и массив не заполняется? - Delphi
Добрый вечер. Почему While не срабатывает второй раз и массив не заполняется? Но если закоментить первый While то второй начинает...

Почему не работает выбор селекта во второй раз? - jQuery
нашел скрипт для нестандартного скролла, выбираю первый раз из списка - все гуд! далее пытаюсь еще раз выбрать, но почему-то селект...


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

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Опции темы

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