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

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

Войти
Регистрация
Восстановить пароль
Другие темы раздела
C++ Вывод интервального ряда в виде таблицы http://www.cyberforum.ru/cpp-beginners/thread1549851.html
Имеется информация о количестве книг, полученных студентами по абонементу за прошедший учебный год. Массив чисел: 4 интервала ---------------------------------------------------------------...
C++ Узнать сколько символов осталось во входной очереди после cin Доброго времени суток, подскажите пожалуйста как узнать, сколько символов осталось во входной очереди (скажем после неудачного использования cin). При этом cin.get() нельзя применять, ибо эти символы... http://www.cyberforum.ru/cpp-beginners/thread1549831.html
Узнать скорость записи в файл C++
Планирую работать с записью в файл больших объёмов. Хотелось бы узнать скорость записи. Мб для теста использовать вечный цикл и забивать файл одиночными символами и по достижении секунды выйти из...
не работает код из книги класс C++
сейчас учусь программированию по книге и дошел до классов. суть классов немного разобрался, но почему то методы класса не работают. хотя переписал все по книге. книга джесс либерти. освой...
C++ Поиск каталогов http://www.cyberforum.ru/cpp-beginners/thread1549811.html
Как реализовать функцию, находящую на диске все каталоги?
C++ Функциональный объект и подсчёт определённых значений в векторе Необходимо реализовать подсчёт количества элементов вектора, больших некоторого значения (вводится с клавиатуры), используя функтор. #include "stdafx.h" using namespace std; int i = 0;... подробнее

Показать сообщение отдельно
Rius
Эксперт .NET
3043 / 2093 / 496
Регистрация: 25.05.2015
Сообщений: 6,828
Записей в блоге: 9
Завершенные тесты: 4
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
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.