Форум программистов, компьютерный форум, киберфорум
Java SE (J2SE)
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.93/29: Рейтинг темы: голосов - 29, средняя оценка - 4.93
0 / 0 / 0
Регистрация: 26.10.2017
Сообщений: 10

Почему переменная изменяется после выполнения метода

15.11.2017, 21:25. Показов 7228. Ответов 115
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Вот код:
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
public class Main {
public static void main(String []args){
    int v = 4;
    System.out.println("v= "+v);
    qw(v);
    System.out.println("v="+v);
    int tab[] = {10};
    System.out.println("tab[0]: "+tab[0]);
    ex(tab);
    System.out.println("tab[0]: "+tab[0]);
}
static void qw(int s){
    System.out.println("s= "+s);
    s++;
    System.out.println("s= "+s);
}
static void ex(int[] wrt){
    System.out.println("wrt[0]: "+wrt[0]);
    wrt[0] += 5;
    System.out.println("wrt[0]: "+wrt[0]);
}   
 
 
}
Почему переменная tab[0] изменяеться после выполнения метода , а int v - нет. Интересует именно данный случай.
Всем добра
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
15.11.2017, 21:25
Ответы с готовыми решениями:

Почему глобальная переменная не изменяется из функции?
Здравствуйте! Делаю такую программу. Сначала создаю анимацию - увеличение размеров контейнера. Затем, когда он становится нужного...

Какое значение примет переменная после выполнения фрагмента алгоритма, если переменная а имела значение 'ИНФОРМАТИКА'
Имеется фрагмент алгоритма, записанный на алгоритмическом языке: m := 10 b := Извлечь(а, m) нц для k от 4 до 5 с := Извлечь(а,...

После выполнения ajax-запроса переменная теряется
Возможно я чего-либо не смыслю в тонкостях работы JS. У меня есть такая функция: const DatabaseHandler = { //... request:...

115
958 / 577 / 136
Регистрация: 23.05.2012
Сообщений: 7,364
16.11.2017, 18:50
Студворк — интернет-сервис помощи студентам
Java
1
2
3
4
5
6
7
8
9
public static void test(MyClazz myClazz) {
   myClazz = new MyClazz();
}
 
public static void main(String... args) {
   MyClazz a = new MyClazz();
   test(a);
   //какое значение будет после вызова метода в а?
}
Если а не менятся, то о каком by reference может быть речь?
0
 Аватар для Kukstyler
1260 / 870 / 268
Регистрация: 02.04.2009
Сообщений: 3,307
16.11.2017, 19:03
xoraxax, что делает метод видно, невидно, что он это делает именно by reference (лично для меня, не видно).

Цитата Сообщение от xoraxax Посмотреть сообщение
ты не сможешь в яве изменить переменную, которую передаешь в метод
Нигде не можешь, не только в Java, нигде! Пересмотри мой предыдущий пост плиззз... Тут речь не о техническом решении, а о терминологии. Технически by reference не существует, в Паскале в том числе. Это всего лишь термин, применённый в синтаксисе некоторых языков.

Когда любой язык, возьмём тот же Паскаль, передаёт в другую функцию параметр by reference, то это "синтаксическая обёртка". Компилятор трансформирует это в передачу по значению адреса переменной.

Псевдокод:

Code
1
2
int myVar;
call myPgm using by reference myVar
технически эквивалентно, т.к. трансформируется компилятором в:

Code
1
2
3
int myVar;
ptr PTR_myVar
call myPgm using by value PTR_myVar
Добавлено через 5 минут
JIeIIIa, а если меняется?

Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
public class Start {
    public int myVar;
    
    public static void modify(Start param) {
        param.myVar = 7;
    }
    
    public static void main(String[] args) {
        Start start = new Start();
        
        start.myVar = 5;
        
        System.out.println(start.myVar);
        
        modify(start);
        
        System.out.println(start.myVar);
    }    
}
0
958 / 577 / 136
Регистрация: 23.05.2012
Сообщений: 7,364
16.11.2017, 19:06
Цитата Сообщение от Kukstyler Посмотреть сообщение
by reference не существует, в Паскале в том числе
"Сильное заявление, проверять я его конечно не буду"

Kukstyler, еще раз: integer - это аналог примитивных типов в Java. Указываете в Паскале val и будет передача по ссылке (после выполнения значение переменной изменится); не указываете val - передача по значению (и значение переменной после выполнения процедуры не изменится). Вы же какую-то неявную передачу придумали...

Добавлено через 49 секунд
Цитата Сообщение от Kukstyler Посмотреть сообщение
а если меняется?
Что общего у Вашего и моего примера?
Передаете в метод значение ссылки. Меняете то, что лежит по сслыке. Сама ссылка при этом не меняется. Вы вот поменяйте саму ссылку! Так чтоб после выполнения метода переменная ссылалась на что-то другое.
0
 Аватар для Kukstyler
1260 / 870 / 268
Регистрация: 02.04.2009
Сообщений: 3,307
16.11.2017, 19:21
Цитата Сообщение от JIeIIIa Посмотреть сообщение
проверять я его конечно не буду
Ещё как будем : вопрос на засыпку: назовите, что конкретно передаётся из одной функции в другую в Паскале, когда передача параметра происходит by reference? Что конкретно получает вторая, получающая параметр функция? Прошу чёткого обозначения.

Добавлено через 1 минуту

Не по теме:

Цитата Сообщение от JIeIIIa Посмотреть сообщение
Сама ссылка при этом не меняется.
:facepalm: Прошу внимательно перечитать мои посты!



Добавлено через 11 минут
Цитата Сообщение от JIeIIIa Посмотреть сообщение
Меняете то, что лежит по сслыке.
Что и называется by reference!!!
0
Эксперт Java
3639 / 2971 / 918
Регистрация: 05.07.2013
Сообщений: 14,220
16.11.2017, 19:35
Цитата Сообщение от Kukstyler Посмотреть сообщение
Что и называется by reference!!!
последний раз пытаюсь
Java
1
2
3
4
5
6
void method(List a) {...}
 
main() {
    List aList = new ArrayList();
    method(aList);
}
Напиши method так, чтобы после вызова aList ссылался на другой лист, созданный внутри method.

В паскале такое возможно, т.к. там есть by-ref.

Цитата Сообщение от Kukstyler Посмотреть сообщение
назовите, что конкретно передаётся из одной функции в другую в Паскале
Как это работает под капотом тебя интересовать не должно. Т.к. сам говоришь, что речь идет о понятиях. Однако, думать можно, что туда передается ссылка на переменную, а не ссылка, которая содержится в переменной.
0
958 / 577 / 136
Регистрация: 23.05.2012
Сообщений: 7,364
16.11.2017, 19:57
Цитата Сообщение от Kukstyler Посмотреть сообщение
Ещё как будем
Ок. Проверяем. Пример со ссылками (a - указывает на адрес памяти; a^ - указывает на то, что лежит по этому адресу):
Кликните здесь для просмотра всего текста
Pascal
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
var
  a, b: ^integer;
 
procedure byVal(i: ^integer);
begin
  writeln('begin: from byVal i = ', i^, '   adress=', i);
  new(i);
  i^ := 2;
  writeln('end:   from byVal i = ', i^, '   adress=', i);
end;
 
procedure byRef(var i: ^integer);
begin
  writeln('begin: from byRef i = ', i^, '   adress=', i);
  new(i);
  i^ := 3;
  writeln('end:   from byRef i = ', i^, '   adress=', i);
end;
 
begin
  new(a);
  b := a;
  a^ := 1;
  writeln('  a at start = ', a^, '          adress=', a);
  writeln('  b at start = ', b^, '          adress=', b);
  byVal(a);
  writeln('  a after byVal = ', a^, '       adress=', a);
  writeln('  b after byVal = ', b^, '       adress=', b);
  byRef(a);
  writeln('  a after byRef = ', a^, '       adress=', a);
  writeln('  b after byRef = ', b^, '       adress=', b);
  dispose(a);
  dispose(b);
end.


Результат:
Кликните здесь для просмотра всего текста
Code
1
2
3
4
5
6
7
8
9
10
  a at start = 1          adress=$028558D8
  b at start = 1          adress=$028558D8
begin: from byVal i = 1   adress=$028558D8
end:   from byVal i = 2   adress=$09A32B64
  a after byVal = 1       adress=$028558D8
  b after byVal = 1       adress=$028558D8
begin: from byRef i = 1   adress=$028558D8
end:   from byRef i = 3   adress=$08F16BDC
  a after byRef = 3       adress=$08F16BDC
  b after byRef = 1       adress=$028558D8

Прошу обратить внимание, что в byRef и в byVal меняется указатель на адрес памяти и значение. При этом это никак не влияет на переменную b.

В Java такого сделать не выйдет (смотреть мой пример ранее).

Добавлено через 20 минут
Чуть изменил чтоб видели что происходит с глобальной переменной в процедурах
Кликните здесь для просмотра всего текста
Pascal
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
var
  a, b: ^integer;
 
procedure byVal(i: ^integer);
begin
  writeln('begin: from byVal i = ', i^, '   adress=', i);
  writeln('begin: from byVal a = ', a^, '   adress=', a);
  new(i);
  i^ := 2;
  writeln('end:   from byVal i = ', i^, '   adress=', i);
  writeln('end:   from byVal a = ', a^, '   adress=', a);
end;
 
procedure byRef(var i: ^integer);
begin
  writeln('begin: from byRef i = ', i^, '   adress=', i);
  writeln('begin: from byRef a = ', a^, '   adress=', a);
  new(i);
  i^ := 3;
  writeln('end:   from byRef i = ', i^, '   adress=', i);
  writeln('end:   from byRef a = ', a^, '   adress=', a);
end;
 
begin
  new(a);
  b := a;
  a^ := 1;
  writeln('  a at start = ', a^, '          adress=', a);
  writeln('  b at start = ', b^, '          adress=', b);
  byVal(a);
  writeln('  a after byVal = ', a^, '       adress=', a);
  writeln('  b after byVal = ', b^, '       adress=', b);
  byRef(a);
  writeln('  a after byRef = ', a^, '       adress=', a);
  writeln('  b after byRef = ', b^, '       adress=', b);
  dispose(a);
  dispose(b);
end.

Результат:
Кликните здесь для просмотра всего текста
Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
  a at start = 1          adress=$0970A3A0
  b at start = 1          adress=$0970A3A0
begin: from byVal i = 1   adress=$0970A3A0
begin: from byVal a = 1   adress=$0970A3A0
end:   from byVal i = 2   adress=$02814C0C
end:   from byVal a = 1   adress=$0970A3A0
  a after byVal = 1       adress=$0970A3A0
  b after byVal = 1       adress=$0970A3A0
begin: from byRef i = 1   adress=$0970A3A0
begin: from byRef a = 1   adress=$0970A3A0
end:   from byRef i = 3   adress=$02855868
end:   from byRef a = 3   adress=$02855868
  a after byRef = 3       adress=$02855868
  b after byRef = 1       adress=$0970A3A0
0
Эксперт функциональных языков программированияЭксперт Java
 Аватар для korvin_
4576 / 2775 / 491
Регистрация: 28.04.2012
Сообщений: 8,782
16.11.2017, 20:23
Цитата Сообщение от Kukstyler Посмотреть сообщение
Угу, это про var и есть.

Цитата Сообщение от Kukstyler Посмотреть сообщение
По Си всё прекрасно видно по коду
1) видно, что для передачи указателя используется операция взятия адреса, которой в джаве тоже нет.
2) и это не передача по ссылке, которой в Си тоже нет. Зато есть в C++:
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
#include <iostream>
#include <stdio.h>
#include <cstdint>
 
using namespace std;
 
void print_var(char name, int& value) {
    uintptr_t addr = reinterpret_cast<uintptr_t>(&value);
    printf("%c value = %d, address = %p\n", name, value, addr);
}
 
void my_proc(int& b) {
    print_var('b', b);
    b = 7;
}
 
int main() {
    int a = 5;
    print_var('a', a);
    my_proc(a);
    printf("after my_proc\n");
    print_var('a', a);
    return 0;
}
https://ideone.com/4EXKjK

Code
1
2
3
4
a value = 5, address = 0x7ffddaa70aec
b value = 5, address = 0x7ffddaa70aec
after my_proc
a value = 7, address = 0x7ffddaa70aec
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
#include <iostream>
#include <stdio.h>
#include <cstdint>
 
using namespace std;
 
void print_pvar(char name, int* pvalue) {
    auto addr  = reinterpret_cast<uintptr_t>( pvalue);
    auto paddr = reinterpret_cast<uintptr_t>(&pvalue);
    printf(" %c value = %p, address = %p\n", name,  pvalue, paddr);
    printf("*%c value = %d, address = %p\n", name, *pvalue,  addr);
}
 
void my_proc(int* b) {
    print_pvar('b', b);
    *b = 7;
}
 
int main() {
    int a = 5;
    print_pvar('a', &a);
    my_proc(&a);
    printf("after my_proc\n");
    print_pvar('a', &a);
    return 0;
}
https://ideone.com/wsPS3d

Code
1
2
3
4
5
6
7
 a value = 0x7fff87ddf99c, address = 0x7fff87ddf968
*a value = 5, address = 0x7fff87ddf99c
 b value = 0x7fff87ddf99c, address = 0x7fff87ddf968
*b value = 5, address = 0x7fff87ddf99c
after my_proc
 a value = 0x7fff87ddf99c, address = 0x7fff87ddf968
*a value = 7, address = 0x7fff87ddf99c
Чуешь разницу?


Цитата Сообщение от Kukstyler Посмотреть сообщение
Называется это передачей по значению? - НЕТ
Да. Это передача значения указателя, значением указателя является адрес.

Цитата Сообщение от Kukstyler Посмотреть сообщение
Называется передачей by reference!
Нет.

Цитата Сообщение от Kukstyler Посмотреть сообщение
Технически, ВСЕ передачи происходят по значению, АБСОЛЮТНО
Нет.

Добавлено через 9 минут
Цитата Сообщение от JIeIIIa Посмотреть сообщение
Указываете в Паскале val
Не, там просто var убрать надо, чтобы было by-value.
0
958 / 577 / 136
Регистрация: 23.05.2012
Сообщений: 7,364
16.11.2017, 20:34
korvin_, ага. Попутал var и val
0
 Аватар для Kukstyler
1260 / 870 / 268
Регистрация: 02.04.2009
Сообщений: 3,307
17.11.2017, 11:45
Цитата Сообщение от korvin_ Посмотреть сообщение
видно, что для передачи указателя используется операция взятия адреса,
Если на то пошло, видно не только это, но и что функция принимающая параметр, ждёт именно адрес. А делается это для чего? Для того, что бы функция 2 могла модифицировать значение переменной в функции 1.
Цитата Сообщение от korvin_ Посмотреть сообщение
и это не передача по ссылке
Передача по указателю, explicit-ная, т.к. в Си синтаксически нет implicit-ной формы передачи по указателю.

В твоём коде С++, ты выводишь адрес переменной, и адрес указателя, указывающего на эту переменную. Разницу чего я должен почуять? То что переменная int и другая переменная int* (тип указатель на int) имеют разные адреса? Это же очевидно, но, прости, мне не понятно что ты этим хочешь сказать. Ты имеешь в виду, что т.к. в Си синтаксически не существует implicit-ной формы передачи по указателю, то при объявлении указателя в параметрах, функция получает адрес указателя, и только после, через содержимое указателя, получает адрес самой переменной? Согласен! Но я уже говори на этот счёт. Это всего лишь вопрос синтаксиса языка (и компилятора, как он трансформирует это потом в машинный код).

В данном случае, создаётся ещё одна переменная. Но давайте зреть в корень. Не как это делается в каждом языке, а почему/для чего существует понятие "by reference" и передача по указателю/ссылке? Суть же в том, что бы функция-2 могла получив адрес/ссылку переменной/объекта, могла модифицировать содержание этой/го переменной/объекта?!

Цитата Сообщение от korvin_ Посмотреть сообщение
Да. Это передача значения указателя, значением указателя является адрес.
Цитата Сообщение от korvin_ Посмотреть сообщение
- Технически, ВСЕ передачи происходят по значению, АБСОЛЮТНО
- Нет.
А проверять мы это будем? Или оставим просто на "нет"? Значит, ты не согласен, что при implicit-ной передаче адреса, синтаксическим "трюком" какого-либо языка, адрес переменной не передаётся по значению? А по чему тогда?

xoraxax, почему ты постоянно сворачиваешь куда-то?! Я не говорю про затирание ссылки новым адресом, ни в одном из моих постов я об этом не говорил. Я говорю про то, что в 2-х методах можно изменить параметры одного и того-же объекта. О том, что содержимое переменной в функции-1 может быть изменено в функции-2. Про сам принцип, про понятие как таковое.

Я же несколько цитат привёл из гугла, где чётко используется слово "reference/by reference". Почему никто не приводит аргументы конкретно опровергающие правильность содержания данных цитат?

JIeIIIa, если я правильно понял Ваш пример, то Вы говорите о том же, о чём korvin_. Хотите доказать мне, что у переменной типа указатель есть свой адрес в памяти... Это очевидно и так, я об этом и не спорил и не говорил.

Цитата Сообщение от JIeIIIa Посмотреть сообщение
Прошу обратить внимание, что в byRef и в byVal меняется указатель на адрес памяти и значение.
Ничего не меняется. Это адреса 2-x разных переменных. В одном случае, адрес самой переменной, а в другом, адрес указателя, который, в свою очередь содержит адрес переменной.

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

Господа, Вы пытаетесь сказать мне, что наличие, либо отсутствие промежуточной, явно объявленной переменной типа указатель, определяет тип передачи параметров, by value он или by reference? Если да, то это просто поверхностный взгляд на суть вопроса, вы уж меня простите. Ибо операция сама, передачи адреса, всегда происходит по значению, ВЕЗДЕ, будь то implicit-но (передача адреса самой переменной), или explicit-но (передача адреса указателя, содержащего адрес переменной). Если не согласны - обоснуйте, ЧТО передаётся и КАК в паскале когда передача переменной происходит by reference? Не адрес переменной по значению?

Цитата Сообщение от JIeIIIa Посмотреть сообщение
В Java такого сделать не выйдет
Опять... В Java можно изменить один и тот же объект в разных методах, содержащих ссылку на этот тот же самый объект. Так или нет? Если не верите, запустите мой код.

Дорогие JIeIIIa, korvin_, xoraxax. Прокомментируйте пожалуйста эти цитаты, и в частности неправильность используемой терминологии касаемо "reference":

In C++, object variables hold values, not object references
In Java most objects have reference semantics, which means that a variable doesn't store an object, it stores a reference to an object so that if the object is modified via one reference all other references see the changes.

In Java ... if the object is modified via one reference all other references see the changes.
0
Эксперт Java
3639 / 2971 / 918
Регистрация: 05.07.2013
Сообщений: 14,220
17.11.2017, 12:22
Цитата Сообщение от xoraxax Посмотреть сообщение
Как это работает под капотом тебя интересовать не должно. Т.к. сам говоришь, что речь идет о понятиях. Однако, думать можно, что туда передается ссылка на переменную, а не ссылка, которая содержится в переменной.
ты не читаешь, что я пишу?
0
 Аватар для Kukstyler
1260 / 870 / 268
Регистрация: 02.04.2009
Сообщений: 3,307
17.11.2017, 12:37
xoraxax, читаю. Просто ты акцент смещаешь на затирание атрибута переданного как параметр в другой метод.
Я всегда "под капот" смотрю, профиль такой.

Цитата Сообщение от xoraxax Посмотреть сообщение
сам говоришь, что речь идет о понятиях.
Именно!
Резюмируя, я говорю следующее:
1. Если говорить о понятии, то обращение к данным по адресу называется by reference. Точка.
2. Если говорить о технической ("подкапоной" части): везде, адрес переменной (любого типа, включая pointer) передаётся по значению.
3. Если язык позволяет implicit-ную передачу средствами синтаксической конструкции ("by ref") - под капотом, всё равно (!!!) передаётся адрес переменной по значению.

Технически существует только by value. by reference - это понятие, интегрированное в синтаксис некоторых языков.
0
Эксперт Java
3639 / 2971 / 918
Регистрация: 05.07.2013
Сообщений: 14,220
17.11.2017, 13:04
Цитата Сообщение от Kukstyler Посмотреть сообщение
Именно!
ну раз именно, разберись, что понимается под by-value и by-reference
0
 Аватар для Kukstyler
1260 / 870 / 268
Регистрация: 02.04.2009
Сообщений: 3,307
17.11.2017, 13:37
xoraxax, Да я давно разобрался!

https://en.wikipedia.org/wiki/... _reference

Цитата Сообщение от Wikipedia
Call by reference (also referred to as pass by reference) is an evaluation strategy where a function receives an implicit reference to a variable used as argument, rather than a copy of its value. This typically means that the function can modify (i.e. assign to) the variable used as argument — something that will be seen by its caller.
https://en.wikipedia.org/wiki/... l_by_value

Цитата Сообщение от Wikipedia
Call by value (also referred to as pass by value) is the most common evaluation strategy, used in languages as different as C and Scheme. In call by value, the argument expression is evaluated, and the resulting value is bound to the corresponding variable in the function (frequently by copying the value into a new memory region).

https://en.wikipedia.org/wiki/... er_science)
Цитата Сообщение от Wikipedia
In computer science, a reference is a value that enables a program to indirectly access a particular datum, such as a variable or a record, in the computer's memory or in some other storage device. The reference is said to refer to the datum, and accessing the datum is called dereferencing the reference.
https://en.wikipedia.org/wiki/Dereference_operator
Цитата Сообщение от Wikipedia
The dereference operator or indirection operator, denoted by "*" (i.e. an asterisk), is a unary operator (one operator) found in C-like languages that include pointer variables. It operates on a pointer variable, and returns an l-value equivalent to the value at the pointer address. This is called "dereferencing" the pointer.
https://www.freepascal.org/doc... fse15.html
Pascal
1
Var p : array[0..Infinity] of Longint;
...
The reference P^ is then the same as p[0].
Для разнообразия, ловите пример на Кобол-е, который тоже имеет синтаксический механизм implicit-ной передачи::

Code
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
 ID DIVISION.
 PROGRAM-ID. myFunc1. 
 DATA DIVISION.
 WORKING-STORAGE SECTION.
 01  myVar                         PIC S9(9) COMP-5 VALUE 12345.
 01  PTRmyVar                      POINTER.
 01  PTRmyVar-N REDEFINES PTRmyVar PIC S9(9) COMP-5.
 
 PROCEDURE DIVISION.      
     MOVE FUNCTION ADDR(myVar) TO PTRmyVar
     
     DISPLAY "---------------------------------------"
     DISPLAY "myFunc1 -> Pointer to myVar          : " PTRmyVar 
     DISPLAY "---------------------------------------"    
     DISPLAY "myFunc1 -> myVar before CALL BY VALUE: " myVar
     
     CALL "myFunc2" USING BY VALUE PTRmyVar-N
     
     DISPLAY "myFunc1 -> myVar after  CALL BY VALUE: " myVar
     DISPLAY "---------------------------------------"
     
     MOVE 12345 TO myVar
     
     DISPLAY "myFunc1 -> myVar before CALL BY REFER: " myVar
     
     CALL "myFunc2" USING BY REFERENCE myVar
          
     DISPLAY "myFunc1 -> myVar after  CALL BY REFER: " myVar
     .
 
 
 
******************************************************   
 ID DIVISION.
 PROGRAM-ID. myFunc2.
 DATA DIVISION.
 WORKING-STORAGE SECTION.
 01  PTRmyVar POINTER. 
 LINKAGE SECTION.
 01  LNKmyVar PIC S9(9) COMP-5.
 PROCEDURE DIVISION USING LNKmyVar. 
     
     MOVE FUNCTION ADDR(LNKmyVar) TO PTRmyVar
     
     DISPLAY "myFunc2 -> myVar receiving   BY REFER: " LNKmyVar
     DISPLAY "myFunc2 -> pointer to received myVar : " PTRmyVar
          
     MOVE 98765 TO LNKmyVar     
     .
Первый раз передаю указатель by value, второй раз передаю саму переменную myVar by reference

Результат:

---------------------------------------
myFunc1 -> Pointer to myVar : 08614000
---------------------------------------
myFunc1 -> myVar before CALL BY VALUE: +000012345
myFunc2 -> myVar receiving BY REFER: +000012345
myFunc2 -> pointer to received myVar : 08614000
myFunc1 -> myVar after CALL BY VALUE: +000098765
---------------------------------------
myFunc1 -> myVar before CALL BY REFER: +000012345
myFunc2 -> myVar receiving BY REFER: +000012345
myFunc2 -> pointer to received myVar : 08614000
myFunc1 -> myVar after CALL BY REFER: +000098765
0
Эксперт Java
3639 / 2971 / 918
Регистрация: 05.07.2013
Сообщений: 14,220
17.11.2017, 14:15
Цитата Сообщение от Kukstyler Посмотреть сообщение
implicit reference to a variable
это как-то противоречит тому, что я говорю?
0
958 / 577 / 136
Регистрация: 23.05.2012
Сообщений: 7,364
17.11.2017, 14:31
Kukstyler, в byVal выделяется память для перенной i, которая была передана как параметр и это никак не влияет на глобальную переменную а; в byRef как только выделяем память для переменной i - сразу же меняется и адрес глобальной переменной а и никак не влияет на переменную b.
И вот во втором (byRef) случае это
Цитата Сообщение от Kukstyler Посмотреть сообщение
function can modify (i.e. assign to) the variable used as argument — something that will be seen by its caller
По сути приведенные мной методы отличаются только тремя символами: var! Cемантика вызовов двух функций одинакова! То что делается "под капотом" в данном случае не интересно. Смотрим на результат!
0
 Аватар для Kukstyler
1260 / 870 / 268
Регистрация: 02.04.2009
Сообщений: 3,307
17.11.2017, 15:42
xoraxax, не противоречит. Фишка в том, что ты не называешь следующее "reference":

Java
1
2
3
4
5
6
public class Start {    
    public static void main(String[] args) {
        Start start1 = new Start();
        Start start2 = start1;      
    }    
}
Что находится в start1 и start2? Ссылка на один и тот-же объект. Обращение к данному объекту с помощью start1 и/или start2 и есть обращение by it's reference, т.к.:

In Java a variable doesn't store an object, it stores a reference to an object so that if the object is modified via one reference all other references see the changes.
JIeIIIa, 3-ый случай называется by content. Это отдельная история (там создаётся копия данных, но пересылается как параметр именно адрес этой новой копии, а не содержание, таким образом изменения не видны в caller-е.). Но это тут ни к чему, а то совсем запутается всё. Но если интересно, вот описание: https://www.ibm.com/support/kn... assing.htm

Ребят, очевидно, что вы не смотрите "под капот", и сами в этом признаётесь. Не можете или не хотите понимать, что:
1. Если вы исходите из того, что происходит "под капотом", то: всё всегда происходит by value - в том числе и копирование адреса указателя или переменной. Что опровергает вашу-же версию о том, что на самом деле технически by reference существует.
2. Если вы исходите из терминологии, то by reference означает обращение по адресу. Чего вы не признаёте, и называете это by value.
3. Упорно не хотите аргументированно опровергнуть правильность использования термина "reference" в приведённых мной цитатах, которыми кишит интернет.

Котлеты отдельно, мухи отдельно, иначе мы с вами ни к чему не придём.

Итог. Определитесь:
1. Либо мы говорим о "подкапотных" механизмах, и вы должны признать, что даже при синтаксических тюнингах в некоторых языках, на "подкапотном" уровне всё передаётся по значению (бы валуе), включая адреса, и тогда вы признаёте, что на "подкапотном" уровне by reference не существует.
2. Либо мы говорим о терминологии (внедрившуюся в синтаксис некоторых языков, как Паскаль), а в таком случае, термин "by reference" означает обращение к переменной по её адресу.

Чётче/ярче/понятнее я объяснить не могу.
0
958 / 577 / 136
Регистрация: 23.05.2012
Сообщений: 7,364
17.11.2017, 15:59
Kukstyler, Oracle (Passing Reference Data Type Arguments) с Вами не согласен.
Reference data type parameters, such as objects, are also passed into methods by value.
Цитата Сообщение от Kukstyler Посмотреть сообщение
Но, Объекты в Java передаются по ссылке
Ок. Смотрим "под капот". В Java при передаче объекта в метод передается ссылка на объект. И передается эта ссылка как значение. Подтверждение этому: в методе Вы никак не можете изменить ссылку так чтоб это было выдно за пределами метода.

В других языках программирования можно передать примитив (или объект), и в методе делать с ним все что угодно. И эти изменения будут видны за приделами метода. Это называется by reference.
0
 Аватар для Kukstyler
1260 / 870 / 268
Регистрация: 02.04.2009
Сообщений: 3,307
17.11.2017, 16:08
JIeIIIa, ёкарный бабай, издеваетесь что ли? Прочитайте мои посты в конце-то концов! Я же сам говорю, что технически всё всегда BY VALUE!!!!!!!!!!!!!!!!

Цитата Сообщение от JIeIIIa Посмотреть сообщение
Это называется by reference.


https://docs.oracle.com/javase... ernal=true

Цитата Сообщение от Oracle
Called by the garbage collector on an object when garbage collection determines that there are no more references to the object.
Добавлено через 2 минуты
JIeIIIa, я Вас тоже уважаю, как и остальных 2-х оппонентов. Только почему Вы игнорируете в очередной раз мою просьбу аргументированно опровергнуть правильность использования термина "reference" в огромном количестве ресурсов, и в том числе и сам Oracle?
0
958 / 577 / 136
Регистрация: 23.05.2012
Сообщений: 7,364
17.11.2017, 16:08
Kukstyler, сорри, но создается впечатление что чукча не читатель, а чукча писатель.
GB вообще не в тему.
0
 Аватар для Kukstyler
1260 / 870 / 268
Регистрация: 02.04.2009
Сообщений: 3,307
17.11.2017, 16:13
JIeIIIa, да при чём тут в тему не тему. Упорно не хотите понимать каких-то вещей, увиливаете от конкретных вопросов, заданных несколько раз. А я после этого чукча....

GB в тему и всё в тему, где чётко используется ТЕРМИН REFERENCE!!!

Добавлено через 1 минуту
KolodeznyDiver, молвите словечко, Вам хотя бы понятно, что я говорю? может я так плохо объясняю?...
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
17.11.2017, 16:13

Почему после изменения шаблона joomla 2.5 на денвере ничего не изменяется ?
html, body, fieldset { margin: 0; padding: 0; } body { margin: 0; padding: 0; font-family: Geneva, Helvetica,...

Какое значение примет переменная S после выполнения операторов
Какое значение примет переменная S после выполнения следующих операторов: а) S:=0; I:=1; repeat S:=S+I; I:=I-1 until i&lt;=1; б)...

Пустой список после выполнения метода
Здравствуйте! Есть два метода, после выполнения первого, список, который я объявил List&lt;Video&gt; videos = new List&lt;Video&gt;()...

Какое значение примет переменная s после выполнения следующих операторов?
s=0; for (i=5; i&gt;1; i--) s=s+i;

Какое значение получит переменная Y после выполнения фрагмента программы
Дело в том что завтро Экзамен...потестам...я не знаю как их решать...кто поможет найти приблизительное решение? Какое значение получит...


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

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
Новые блоги и статьи
Знаете, от чего появляется стресс?
kumehtar 15.07.2026
Стресс появляется оттого, что вы, зная как поступить правильно, делаете наоборот. Ларри Уингет
Нас бьют, а мы крепчаем? Какая чушь!
kumehtar 15.07.2026
Вот это вот бытующее мнение, что человек меняется только под действием проблем, всегда считал вредоносным. Поверь, от проблем у людей появляются не изменения, а нервное расстройство и ПТСР. А. . .
сукцессия 29. Переход от одних деревьев на другие делать более или менее вероятностным?
anaschu 12.07.2026
Насколько смена типов микоризы — исключительное событие в двухвековой сукцессии? Оценка вероятности в пространстве параметров В текущей версии модели успешно реализован ключевой механизм. . .
сукцессия 27. Думаю, как переделывать уже написанную статью с планами на сукцессию.
anaschu 12.07.2026
Анализ соответствия модели требованиям Реализованные компоненты: Механизм закисления почвы через протонную помпу Конкуренция между типами микориз pH как триггер сукцессии C/ P соотношение. . .
Сукцессия 26. Мат модель создана.
anaschu 12.07.2026
Модель смены растительных сукцессий посредством управления грибами работает внутри небольшой ячейки почвы, восстанавливающейся после пожара, где ненадолго бывшее царство хвойных снова захватили. . .
Решил проблему с ошибкой пагинации сообщений с сервера на алгоритме обхода дерева "Эстафета хвоста".
Hrethgir 12.07.2026
Проблема была в том, что удалялась именно новая кнопка, а не старая. Ни один ИИ не обнаружил это, а сам я смог только когда с работой стало попроще и когда заставил работать будущее автономное. . .
сукцессия 25. Хронология ошибок
anaschu 12.07.2026
# От 50-тонного гриба до устойчивого леса: хроника ошибок при построении модели вековой сукцессии микоризы ## О чём эта статья В процессе построения ОДУ-модели (система дифференциальных. . .
сукцессия 24. Промежуточное общее описание модели
anaschu 12.07.2026
Хендофф: модель АМ→ЭКМ сукцессии микоризы (ризосфера, 50 лет) Содержание проекта Симуляция вековой (50 лет) экологической сукцессии в почве леса Основные участники: АМ-гриб, ЭКМ-гриб,. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru