Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.75/4: Рейтинг темы: голосов - 4, средняя оценка - 4.75
Alek70694
4 / 4 / 1
Регистрация: 27.10.2012
Сообщений: 252
1

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

12.04.2016, 23:20. Просмотров 808. Ответов 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
Ответы с готовыми решениями:

Почему если использовать одну переменную в двух циклах, то последний элемент такой же как и второй?
Почему если использовать одну переменную в двух циклах, то последний элемент...

Организовать случайные числа для массива, если каждое вещественное число должно удовлетворять промежутку
Как организовать случайные числа для массива, если каждое вещественное число...

Повторяющиеся числа из первого массива занести во второй массив только один раз
#include &lt;stdio.h&gt; #include &lt;iostream&gt; #include &lt;cstdlib&gt; using namespace...

Почему после 51-го знака после запятой выводятся одни нули?
В продолжение темы: тот же код, только с увеличенным количеством знаков...

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

7
Renji
2105 / 1545 / 471
Регистрация: 05.06.2014
Сообщений: 4,484
12.04.2016, 23:25 2
Ну, во-первых, в 27 строчке ++ выполняется не там где он написан, а там, где скажет левая пятка компилятора. Порядок действий сохраняется только между точками следования (в нашем случае - начало/конец строчки), между ними разрешается творить любой треш и угар.
Во-вторых, 17 строчка не является частью цикла, потому как в цикл попадет лишь первая {} секция.
В-третьих, заключать в {} одну строчку не нужно, это не Перл.
1
Alek70694
4 / 4 / 1
Регистрация: 27.10.2012
Сообщений: 252
12.04.2016, 23:33  [ТС] 3
Цитата Сообщение от Renji Посмотреть сообщение
Ну, во-первых, в 27 строчке ++ выполняется не там где он написан, а там, где скажет левая пятка компилятора. Порядок действий сохраняется только между точками следования (в нашем случае - начало/конец строчки), между ними разрешается творить любой треш и угар.
Во-вторых, 17 строчка не является частью цикла, потому как в цикл попадет лишь первая {} секция.
В-третьих, заключать в {} одну строчку не нужно, это не Перл.
Не совсем понимаю первый ответ, как это не выполняется ++? А как же тогда код выполняется, по идее ведь увеличивается указатель, затем разыменовывается и дальше мы уже выполняем действия. А если бы написано было так, то правильнее было бы? :
C++
1
    { *m++ *= 2; }
Кстати говоря, 17 строчку я и не хотел в данном коде использовать(вместо него рабочую 16 строчку вписал), а только лишь показал сам код, который некорректно работает, поэтому и закоменчено.
А про скобки - больше так не буду)
0
Alek70694
4 / 4 / 1
Регистрация: 27.10.2012
Сообщений: 252
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
2105 / 1545 / 471
Регистрация: 05.06.2014
Сообщений: 4,484
12.04.2016, 23:42 5
Лучший ответ Сообщение было отмечено Alek70694 как решение

Решение

Цитата Сообщение от 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 / 1
Регистрация: 27.10.2012
Сообщений: 252
12.04.2016, 23:47  [ТС] 6
Цитата Сообщение от Renji Посмотреть сообщение
Ну так к 13 строчке у вас uk уже уехал за границы массива.
А как его к первоначальному виду привести? Только заново присвоить адрес массива?
0
Renji
2105 / 1545 / 471
Регистрация: 05.06.2014
Сообщений: 4,484
12.04.2016, 23:48 7
Цитата Сообщение от Alek70694 Посмотреть сообщение
А как его к первоначальному виду привести? Только заново присвоить адрес массива?
Или заново присвоить, или написать uk-=5;.
1
MansMI
1448 / 1157 / 549
Регистрация: 08.01.2012
Сообщений: 4,509
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

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

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

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


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

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

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