Указатели мертвы?

User avatar
AndreyT
Уже с Приветом
Posts: 3000
Joined: 14 Apr 2004 01:11
Location: SFBA (было: Минск, Беларусь)

Re: Указатели мертвы?

Post by AndreyT »

venco wrote:
nightmare2 wrote:Ссылки есть, а переменных типа указатель на ... нет.
Т.е. если назвать указатели ссылками, то указатели исчезнут.
В принципе - да. Одним из фундаментальных свойств типа "указатель" в С/С++ является то, что это объектный тип. Т.е. допускается существование lvalue этого типа. Без этого это уже не указатели. По крайней мере не те указатели, которые были введены изначально в контексте этой дискуссии.

Сюда, кстати, ведет и вопрос об "указателях на указатель". Правильный ответ: такой качественной сущности ("концепции") как "указатель на указатель" в С/С++ не существует вообще. В С/С++ существует лишь "указатель на тип T", а то, что тип T сам по себе тоже может являться указателем - не важно и никакой качественной роли не играет.
Last edited by AndreyT on 03 Dec 2015 19:05, edited 2 times in total.
Best regards,
Андрей
nightmare2
Уже с Приветом
Posts: 7187
Joined: 31 Jan 2005 15:06
Location: GA

Re: Указатели мертвы?

Post by nightmare2 »

venco wrote:
nightmare2 wrote:Ссылки есть, а переменных типа указатель на ... нет.
Т.е. если назвать указатели ссылками, то указатели исчезнут...
Не верите мне, вот вам цитаты из википедии.
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.
...

In computer science, a pointer is a programming language object, whose value refers to (or "points to") another value stored elsewhere in the computer memory using its address.
...

Java
Unlike C, C++, or Pascal, there is no explicit representation of pointers in Java. Instead, more complex data structures like objects and arrays are implemented using references. The language does not provide any explicit pointer manipulation operators.
Кстати, в Java нет никаких аналогов указателей на функцию (во всяком случае не было раньше). В С# есть делегат.
В Java невозможно передать параметр функции как ссылку на объект по ссылке (каламбур, однако). Интересно почему? В С# можно.
Т.е. фактически, ссылки в Java на объекты - это внутенний механизм, на который программист не имеет никакого влияния, в отличие от указателей в других языках.
Vaiyo A-O, A Home Va Ya Ray, Vaiyo A-Rah, Jerhume Brunnen G!
nightmare2
Уже с Приветом
Posts: 7187
Joined: 31 Jan 2005 15:06
Location: GA

Re: Указатели мертвы?

Post by nightmare2 »

Мальчик-Одуванчик wrote:Вообще язык программирования - это лишь один из инструментов программирования наряду с концепциями, парадигмами, паттернами ...
Очевидно что концепция указателей является одним из базовых понятий.
Я с этим не спорю, но все же язык - это то, при помощи чего мы можем выразить все эти концепции.
Масса современных языков указателей не имеют.
Концепция "указатель на указатели" чужда программистам на Java, если они конечно не изучали какой-либо язык с настоящими указателями или пришли из С/С++.
Даже в этом топике у нас есть разногласия по вопросу указатель/сылка.
Вот как вы будете тестировать venco?
Спросите понимает ли он что такое двумерный массив?
Но массивы понимают практически все, это нам ничего не даст.
Vaiyo A-O, A Home Va Ya Ray, Vaiyo A-Rah, Jerhume Brunnen G!
User avatar
AndreyT
Уже с Приветом
Posts: 3000
Joined: 14 Apr 2004 01:11
Location: SFBA (было: Минск, Беларусь)

Re: Указатели мертвы?

Post by AndreyT »

nightmare2 wrote:Не верите мне, вот вам цитаты из википедии.
Википедия не является сколь-нибудь авторитетным источником в таких вопросах. (Как, впрочем, и в любых других.)
Best regards,
Андрей
User avatar
venco
Уже с Приветом
Posts: 2001
Joined: 10 Nov 2004 00:34
Location: MD

Re: Указатели мертвы?

Post by venco »

Если на клетке слона прочтёшь надпись «буйвол», не верь глазам своим. (ц)
nightmare2 wrote: Не верите мне, вот вам цитаты из википедии.
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.
...

In computer science, a pointer is a programming language object, whose value refers to (or "points to") another value stored elsewhere in the computer memory using its address.
Ну и чём под это определение не подходят Java references?

Code: Select all

   String s1 = "123"; // s1 points to an object of type String that's stored somewhere
   String s2 = s1; // s2 points to the same object
Кстати, уточните пожалуйста, в чём отличие вышеприведённых определений указателя и ссылки? Так, чтобы C++ pointer подходил под одно, а C++ reference - под другое.
nightmare2 wrote: В Java невозможно передать параметр функции как ссылку на объект по ссылке (каламбур, однако).
Вы ничего не перепутали? В Java невозможно передать объект в функцию не по ссылке. Обязательно получится ссылка. Её так называют в Java, хотя по поведению такой параметер похож на C++ указатель - его можно изменить, т.е. указать на другой объект. C++ параметер по ссылке всегда указывает на один объект.
nightmare2 wrote:Т.е. фактически, ссылки в Java на объекты - это внутенний механизм, на который программист не имеет никакого влияния, в отличие от указателей в других языках.
В C/C++ указатели/ссылки - тоже внутренний механизм, просто C/C++ позволяют сделать многое из того, что делать нельзя, а в Java есть много ограничений, что и как можно использовать.
nightmare2
Уже с Приветом
Posts: 7187
Joined: 31 Jan 2005 15:06
Location: GA

Re: Указатели мертвы?

Post by nightmare2 »

AndreyT wrote:Википедия не является сколь-нибудь авторитетным источником в таких вопросах. (Как, впрочем, и в любых других.)
Согласен.
Но текст мне показался удачно все объясняющий.
Vaiyo A-O, A Home Va Ya Ray, Vaiyo A-Rah, Jerhume Brunnen G!
User avatar
venco
Уже с Приветом
Posts: 2001
Joined: 10 Nov 2004 00:34
Location: MD

Re: Указатели мертвы?

Post by venco »

AndreyT wrote:
venco wrote:
nightmare2 wrote:Ссылки есть, а переменных типа указатель на ... нет.
Т.е. если назвать указатели ссылками, то указатели исчезнут.
В принципе - да. Одним из фундаментальных свойств типа "указатель" в С/С++ является то, что это объектный тип. Т.е. допускается существование lvalue этого типа. Без этого это уже не указатели. По крайней мере не те указатели, которые были введены изначально в контексте этой дискуссии.
Немного странное условие для указателей - возможность быть lvalue. Тем не менее, в Java ссылки могут выть lvalue.
AndreyT wrote:Сюда, кстати, ведет и вопрос об "указателях на указатель". Правильный ответ: такой качественной сущности ("концепции") как "указатель на указатель" в С/С++ не существует вообще. В С/С++ существует лишь "указатель на тип T", а то, что тип T сам по себе тоже может являться указателем - не важно и никакой качественной роли не играет.
А здесь ограничение Java - отсутствие ссылок на примитивные типы, а ссылка как раз примитивный тип.
User avatar
venco
Уже с Приветом
Posts: 2001
Joined: 10 Nov 2004 00:34
Location: MD

Re: Указатели мертвы?

Post by venco »

Ещё одно отличие ссылок от указателей в C/C++ - в валидной программе ссылка всегда указывает на существующий объект, а указатель может быть нулевым.
Так вот в Java ссылка может быть нулевой.
Так что всё это вопрос терминологии, и указатели как концепция есть и в Java.
nightmare2
Уже с Приветом
Posts: 7187
Joined: 31 Jan 2005 15:06
Location: GA

Re: Указатели мертвы?

Post by nightmare2 »

venco wrote:...Вы ничего не перепутали? В Java невозможно передать объект в функцию не по ссылке. Обязательно получится ссылка. Её так называют в Java, хотя по поведению такой параметер похож на C++ указатель - его можно изменить, т.е. указать на другой объект. C++ параметер по ссылке всегда указывает на один объект...
Я не сказал "передать объект по ссылке", я сказал "передать ссылку на объект по ссылке".
Я думаю, что вы не поняли о чем речь, пото му что в Java этого просто нет.
Это то, о чем я говорил "одуванчику".

Попытаюсь объяснить на примере.
Допустим это Java код:

Code: Select all

...
Person a = { Name = 'Alex' },
      b = { Name = 'Mike' };

Swap(Person pa, Person pb)
{
     Person temp = pa;
     pa = pb;
     pb = temp;
}

print a.Name; 
...
Что будет напечатано?
Vaiyo A-O, A Home Va Ya Ray, Vaiyo A-Rah, Jerhume Brunnen G!
User avatar
venco
Уже с Приветом
Posts: 2001
Joined: 10 Nov 2004 00:34
Location: MD

Re: Указатели мертвы?

Post by venco »

Это вы Swap неправильно запрограммировали:

Code: Select all

Swap(Person pa, Person pb)
{
     String temp = pa.Name;
     pa.Name = pb.Name;
     pb.Name = temp;
}
Попробуйте сделать то же самое в C++:

Code: Select all

Swap(Person pa, Person pb)
{
???
}
То, вы не учли, что в Java параметры объекты автоматически передаются по указателю (хорошо, хорошо, ссылке!) - ваша проблема (ну или проблема Java).
nightmare2
Уже с Приветом
Posts: 7187
Joined: 31 Jan 2005 15:06
Location: GA

Re: Указатели мертвы?

Post by nightmare2 »

venco wrote:Ещё одно отличие ссылок от указателей в C/C++ - в валидной программе ссылка всегда указывает на существующий объект, а указатель может быть нулевым.
Так вот в Java ссылка может быть нулевой.
Так что всё это вопрос терминологии, и указатели как концепция есть и в Java.
Просто указатель довольно часто может быть заменен ссылкой.
От этого может показаться, что это одно и то же.
Однако, если вам понадобится написать свой менеджер памяти, то эффективно сделать это вы сможете только с указателями.
Еще если нужен доступ по физическому адресу к чему-нибудь.
Ссылка тут никак не поможет.
Vaiyo A-O, A Home Va Ya Ray, Vaiyo A-Rah, Jerhume Brunnen G!
User avatar
venco
Уже с Приветом
Posts: 2001
Joined: 10 Nov 2004 00:34
Location: MD

Re: Указатели мертвы?

Post by venco »

Я не собираюсь спорить с тем, что в Java многое невозможно сделать на самом языке - это прямое следствие требования безопастности исполнения.
Я лишь не согласен с тем, что там нет такой сущности, как указатели. Они есть, с естественными для Java ограничениями, и по какой-то причине стыдливо названные ссылками.
А то, что ограничены они, пожалуй, сильнее, чем другие типы, так это потому, что возможностей напакостить с указателями гораздо больше. А так и с строками, и с числами в Java меньше возможностей, чем в C/C++.
nightmare2
Уже с Приветом
Posts: 7187
Joined: 31 Jan 2005 15:06
Location: GA

Re: Указатели мертвы?

Post by nightmare2 »

venco wrote:...То, вы не учли, что в Java параметры объекты автоматически передаются по указателю (хорошо, хорошо, ссылке!) - ваша проблема (ну или проблема Java).
Я спросил, что будет напечатано.
Почему вы решили, что я что-то не учел?

Предположим у вас объекты состоят из сотен свойств.
Так и будете каждое свойство переприсваивать?
Не кажется ли вам, что существует более эффективный способ?

Code: Select all

C/C++
int main()
{
  char *str1 = "Alex";
  char *str2 = "Mike";

  swap(str1, str2);
}

void swap(char *str1, char *str2)
{
  char *temp = str1;
  str1 = str2;
  str2 = temp;
}  
  

C#
static void Main(string[] args)
{
     string str1 = "Alex";
     string str2 = "Mike";

     swap(ref str1, ref str2);
}

static void swap(ref string p, ref string q)
{
    string temp;
    temp = p;
    p = q;
    q = temp;
}
Vaiyo A-O, A Home Va Ya Ray, Vaiyo A-Rah, Jerhume Brunnen G!
nightmare2
Уже с Приветом
Posts: 7187
Joined: 31 Jan 2005 15:06
Location: GA

Re: Указатели мертвы?

Post by nightmare2 »

venco wrote:..Я лишь не согласен с тем, что там нет такой сущности, как указатели. Они есть, с естественными для Java ограничениями, и по какой-то причине стыдливо названные ссылками...
Ну как-то мы же должны отличать эти две концепции (сылка на объект и указатель).
Вот, например, если в Java, кто-то решит ввести таки же указатели как в С#.

int x = 10;
int *ptr = &x;

Как тогда мы будем отличать одно от другого, если и то и то называется указатель?
Vaiyo A-O, A Home Va Ya Ray, Vaiyo A-Rah, Jerhume Brunnen G!
User avatar
venco
Уже с Приветом
Posts: 2001
Joined: 10 Nov 2004 00:34
Location: MD

Re: Указатели мертвы?

Post by venco »

nightmare2 wrote:
venco wrote:...То, вы не учли, что в Java параметры объекты автоматически передаются по указателю (хорошо, хорошо, ссылке!) - ваша проблема (ну или проблема Java).
Я спросил, что будет напечатано.
Почему вы решили, что я что-то не учел?
Потому что название функции Swap() подразумевает, что вы хотели обменять содержимое объектов. Ваша функция этого не делает, хотя могла бы, язык это в принципе позволяет, значит вы что-то не учли.
nightmare2 wrote:Предположим у вас объекты состоят из сотен свойств.
Так и будете каждое свойство переприсваивать?
Не кажется ли вам, что существует более эффективный способ?
На Java? Простого нет. Есть через Reflection, не очень удобный, хотя его можно оформить в что-то более-менее приличное. Причина - отсутствие ссылок (указателей) на примитивные типы.
nightmare2 wrote:

Code: Select all

C/C++
int main()
{
  char *str1 = "Alex";
  char *str2 = "Mike";

  swap(str1, str2);
}

void swap(char *str1, char *str2)
{
  char *temp = str1;
  str1 = str2;
  str2 = temp;
}
Ха-ха! Ну и что, по-вашему, эта функция делает?
nightmare2 wrote:C#

Code: Select all

static void Main(string[] args)
{
     string str1 = "Alex";
     string str2 = "Mike";

     swap(ref str1, ref str2);
}

static void swap(ref string p, ref string q)
{
    string temp;
    temp = p;
    p = q;
    q = temp;
}
Наконец-то получилось!
User avatar
venco
Уже с Приветом
Posts: 2001
Joined: 10 Nov 2004 00:34
Location: MD

Re: Указатели мертвы?

Post by venco »

nightmare2 wrote:
venco wrote:..Я лишь не согласен с тем, что там нет такой сущности, как указатели. Они есть, с естественными для Java ограничениями, и по какой-то причине стыдливо названные ссылками...
Ну как-то мы же должны отличать эти две концепции (сылка на объект и указатель).
В C++ есть два разных понятия, семантически и синтаксически, там их надо отличать, хотя и то, и другое, в принципе, одно и то же, с небольшими отличиями.
nightmare2 wrote:Вот, например, если в Java, кто-то решит ввести таки же указатели как в С#.

int x = 10;
int *ptr = &x;

Как тогда мы будем отличать одно от другого, если и то и то называется указатель?
Одно что от другого чего?
У меня такое ощущение, что по-вашему, указатель - обязательно на int. А если на String, то уже не указатель. В Java ихние ссылки - указатели на объекты, производные класса Object. На другие сущности (методы, int, другие ссылки) в Java ссылок брать нельзя. Но это ограничение не отменяет того факта, что указатели на объекты, производные класса Object, там есть.
Alexandr
Уже с Приветом
Posts: 3647
Joined: 23 May 2010 15:10

Re: Указатели мертвы?

Post by Alexandr »

Мальчик-Одуванчик wrote:Указатель на указатели до сих пор остается однозначным тестом на профнепригодность.
вы хотели сказать на профпригодность :)
User avatar
perasperaadastra
Уже с Приветом
Posts: 20128
Joined: 21 Feb 2009 22:55
Location: Лох Онтарио

Re: Указатели мертвы?

Post by perasperaadastra »

Я почитал про то, как работают переменные в питоне и осознал глубину глупости своего вопроса. Если в современных смартфонах не видно антенны, это еще не значит, что ее у них нет. Теперь я понимаю, почему нет необходимости указывать тип в питоне.

PS. Я обожаю интернеты! Всегда можно найти объяснение на доступном уровне.
User avatar
AndreyT
Уже с Приветом
Posts: 3000
Joined: 14 Apr 2004 01:11
Location: SFBA (было: Минск, Беларусь)

Re: Указатели мертвы?

Post by AndreyT »

perasperaadastra wrote:Если в современных смартфонах не видно антенны, это еще не значит, что ее у них нет.
Ну такая логика, если раздуть тему за пределы разумного, может довести вообще до того, что, независимо от языка программирования, "там внутри все равно машинный код" , в котором понятие указателя трактуется по-своему.

В популярном пионерском дебате о том, является ли массив в С и С++ "указателем", всегда, как правило, находится пионер, который бросается взахлеб доказывать, что в С/С++ вообще любая переменная всегда является указателем, ибо "в ассемблере будет mov eax, DWORD PTR [0x12345678], а это - указатель". Т.е. некоторые люди в принципе не желают воспринимать языковые концепции и, поэтому, не в состоянии ухватить умом понятие lvalue и разницу между идеей lvalue и идеей указателя.
Best regards,
Андрей
User avatar
geek7
Уже с Приветом
Posts: 20297
Joined: 01 Dec 2003 23:16
Location: Russia->USA

Re: Указатели мертвы?

Post by geek7 »

OtherSide wrote:
perasperaadastra wrote:
AndreyT wrote:Странный какой-то вопрос. Указатели где? В каком языке?

Язык С используется так же активно, как в килобайтно-мегабайтные времена. А никто не может в С без указателей.
В С, конечно, без указателей не прожить, но разве доля С не уменьшилась в наши дни? Взять, например, квантов — они, поди, пользуются каким-нибудь Питоном, и про указатели не вспоминают. Кроме того, в килобайтно-мегабайтные времена оптимальность была превыше всего, а нынче если быдлокод работает, то все счастливы. Раньше на программиста учиться нужно было, а сейчас любой чайник вроде меня может из интернета надергать куски кода, и сшить франкенштейна.
Ну во первых, что бы нормально кодить даже на питоне приходится лезть в его нутро и разбирать как указатели работают внутри.
На любом собеседовании по C# и Джава справшивают про устройство гарбадж коллектора, ссылочные и по значению типы и т.д.

Во вторых программировать, наоборот, стало гораздо сложнее чем раньше на мой взгляд (кодирую уже лет 20)
Системы стали сложнее, а кодить проще - потому и кодят монстров на которые ранее не замахивались. устройство гарбадж коллектора спрашивают на уровне какие варианты/настройки а не написать таковой. а франкенштейна уже делают на новом уровне - надергать готовых серверов/кластеров (типа RDBMS/ESB/AS..) все это соединить в систему и только поверх заполировать - толи бизнес-кодом толи конфигурированием.
Говори что думаешь, думай что говоришь!
Маразм крепчал и скрепы гнулись
User avatar
flip_flop
Уже с Приветом
Posts: 4379
Joined: 20 Jun 2001 09:01

Re: Указатели мертвы?

Post by flip_flop »

AndreyT wrote:
perasperaadastra wrote:Если в современных смартфонах не видно антенны, это еще не значит, что ее у них нет.
Ну такая логика, если раздуть тему за пределы разумного...
(далее тема раздувается за пределы разумного) :D

Автор топика отошёл от изначального вопроса - надо ли использовать доступ к антенне памяти через указатели (вроде не видно, а она они есть). Универсальный ответ - зависит от задачи. Во многих задачах по прежнему надо, даже в экзафлопную эру.
User avatar
perasperaadastra
Уже с Приветом
Posts: 20128
Joined: 21 Feb 2009 22:55
Location: Лох Онтарио

Re: Указатели мертвы?

Post by perasperaadastra »

Понятие разумного здесь очень относительно. Мое понимание темы настолько незначительно, что вряд ли можно считать мой изначальный вопрос разумным. :) Я напоминаю себе старого преподавателя, который не знал, какую клавишу нажимать в ответ на "press any key" потому что никогда не имел дела с компьютерами.

Return to “Вопросы и новости IT”