LINUX.ORG.RU

Указатели в С и вообще

 ,


2

5

В чем принципиальная необходимость использования указателей? Почему нельзя обращаться к переменной в динамической памяти по ее имени, а не по адресу?

Для меня единственный пример, когда использование указателей естественно и неизбежно - это динамические структуры данных. Связанный список в принципе без указателей не сделать.

Это действительно так, С переиспользует указатели, там где без них можно было бы обойтись? Или есть какие-то детали работы с памятью, которые я упускаю?

★★★★

обращаться к переменной в динамической памяти по ее имени, а не по адресу?

а чем одно отличается от другого?

Rastafarra ★★★★
()

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

Xenius ★★★★★
()

Почему нельзя обращаться к переменной в динамической памяти по ее имени, а не по адресу?

Что такое имя, как ты собрался по нему обращаться, как ты представляешь алгоритм работы? Тебе надо поместить в eax 32 бита. Что будет делать твой код?

crutch_master ★★★★★
()

В чем принципиальная необходимость использования указателей?

прямой доступ к памяти, без слоев абстракции.

waker ★★★★★
()

А структуру ты в функцию целиком копировать будешь? И т.д., и т.п.

Азы программирования надо начинать постигать с ассемблера и С. Тогда таких тупых вопросов не будет. Ведешь себя как пхытонщик какой-то...

anonymous
()

По имени - оперировать значением Если нам важен сам объект, а не значение(чтобы например изменить объект) - то указатели. Но даже если нам важно значение, и если объект это какая-то структура, то чтобы минимизировать создание новых объектов в памяти, можно использовать const указатели как оптимизация.

fsb4000 ★★★★★
()

Без указателей у каждого кусочка памяти должно быть имя, чтобы к нему обратиться. Потенциально количество всевозможных мест в памяти очень велико. Каждому из них особое имя переменной дать невозможно. Указатель похож на указательное местоимение «это». Он позволяет обратиться куда угодно.

Deleted
()

Почему нельзя обращаться к переменной в динамической памяти по ее имени, а не по адресу?

Ты изобрёл ссылки из C++. Они покрывают часть функциональности указателей, но только часть.

i-rinat ★★★★★
()

Вот тут есть хороший пример от Торвальдса с обходом списка (простите за ссылку на хабр) https://habrahabr.ru/company/ruvds/blog/313836/ см прямо в начале два скриншота кода. В языках без указателей списки реализуются через одно место (или используются готовые конструкции языка, предварительно написанные авторами языка на си с указателями)

legolegs ★★★★★
()
Ответ на: комментарий от Xenius

Вот в функции есть параметр. Где он храниться? В стеке. Его (параметра) адрес известен на этапе компиляции? В принципе нет, потому что число параметров неизвестно. Но к нему же обращаются по имени.

hotpil ★★★★
() автор топика
Ответ на: комментарий от legolegs

Про списки я же написал в самом начале.

hotpil ★★★★
() автор топика
Ответ на: комментарий от legolegs

(или используются готовые конструкции языка, предварительно написанные авторами языка на си с указателями)

Что ты несешь.

anonymous
()
Ответ на: комментарий от Twissel

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

hotpil ★★★★
() автор топика

С переиспользует указатели, там где без них можно было бы обойтись?

Да, в большинстве случаев.

Связанный список в принципе без указателей не сделать

Может, ты думаешь что в языках без указателей нет связанных списков?

anonymous
()

Да тут не в ту сторону копаешь, указатели естественны, вот и всё. Всё работает через них так или иначе. Если работать с ними напрямую ты получаешь разные вещи сразу, как они есть, например то что называется union в C, то есть на одном и том же отрезке памяти хранить можно как данные одного типа, так и другого. Опять же union это просто сахар над тем как работает процессор с данными - ему пофиг какого типа данные лежат там или сям, это важно тебе, когда ты используешь те или иные его команды для манипуляций с этими данными.

В общем для прояснения просто учи любой из общеупотребительных ассемблеров, попиши что-нибудь на нём, по взаимодействуй с кодом на С и все вопросы подобного рода исчезнут навсегда. Конечно, может выработаться стойкая неприязнь, но моя воля, выгнал бы всех таких из профессии навсегда.

ixrws ★★★
()
Ответ на: комментарий от hotpil

Его (параметра) адрес известен на этапе компиляции?

Да. Относительно указателя стека

Harald ★★★★★
()
Ответ на: комментарий от hotpil

Может ты неадекватен, не образован, не пытался даже разобраться, а сразу лезешь объяснять людям за жизнь?

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

ixrws ★★★
()
Ответ на: комментарий от i-rinat

Ты изобрёл ссылки из C++. Они покрывают часть функциональности указателей, но только часть.

Если бы ссылку можно было перебиндить (а ничего не мешало так сделать), то покрывалось бы почти всё.

anonymous
()
Ответ на: комментарий от anonymous

Если бы у бабушки, то. Что значит перебиндить, изменить значение ссылки, сделать из неё не ссылку, а указатель?:) Добавить ещё капельку и получить указатели со всеми вытекающими.

ixrws ★★★
()
Ответ на: комментарий от legolegs

Интересные скриншоты, код на 1м мне понятен, объясните, пожалуйста, что происходит на втором.

flyshoot
()
Ответ на: комментарий от legolegs

Вот тут есть хороший пример от Торвальдса с обходом списка

На любых явах-питонах будет так же. Указатели тут вообще ни при чем.

В языках без указателей списки реализуются через одно место (или используются готовые конструкции языка, предварительно написанные авторами языка на си с указателями)

Реализуются они так же, ничего от си там не используется.

anonymous
()

А давайте пальчиком показывать куда структуру запихать и откуда ее брать. Си переиспользует указатили уиии

unt1tled ★★★★
()

Почему нельзя обращаться к переменной в динамической памяти по ее имени, а не по адресу?

Процессор имен не понимает.

tailgunner ★★★★★
()

Указатели (в память) - высший пилотаж, нативное общение с машиной практически не считая обращений к портам, регистрам.

В определенном смысле, все что работает с такими указателями является низкоуровневыми средствами.

Указатели - одно из самых эффективных средств доступа к памяти.

Возможно, стоит попробовать, посмотреть другие языки - c++, rust (весьма удачная попытка минимизировать риски с указателями) или вообще интерпретируемые.

anonymous
()
Ответ на: комментарий от ixrws

Что значит перебиндить, изменить значение ссылки, сделать из неё не ссылку, а указатель?

Перебиндить - изменить целевой объект. Указатель при этом никак не получится.

anonymous
()

указатели хороши тем, что позволяют арифметические действия

VladimirMalyk ★★★★★
()

Я вот подумал, а ведь «традиционные» переменные в С — это тоже адреса, только на стеке. Просто они имеют синтаксический сахар обращения к ним прямо, по имени. Ведь

void function() {
    int value = 42;
}
Транслируется в что-то типа
function():
        push    rbp
        mov     rbp, rsp
        mov     DWORD PTR [rbp-4], 42
        nop
        pop     rbp
        ret
(взято с godbolt.org). Главное вот это: mov DWORD PTR [rbp-4], 42.

Хотя, это может оказаться справедливым только для x86.

KennyMinigun ★★★★★
()
Ответ на: комментарий от hotpil

Следовательно, надо тебя добавить в игнор-лист.

Да пожалуйста. На то он и существует, чтоб туда юзеров добавлять.

Ну зачем ты это здесь написал?

Тот же самый вопрос могу задать тебе. Если ты даже не удосужился почитать Википедию.

Короче, каникулы кончились, а школьники остались.

Желаю успеха!

Twissel ★★★★★
()
Ответ на: комментарий от tailgunner

Процессор имен не понимает

... что, внезапно, не мешает нам пользоваться переменными. И с объектами в куче не помешало бы.

anonymous
()
Ответ на: комментарий от anonymous

... что, внезапно, не мешает нам пользоваться переменными. И с объектами в куче не помешало бы.

Вы ничем не пользуетесь. Вы пишете говнокод, который ест компилятор. Обращение по имени подразумевает хранение где-то этого «имени» и алгоритма поиска по этому «имени», которое тоже суть набор чисел. Что из себя представляет value = 42 написали выше. Нигде нет этого самого «value», т.к. оно на том уровне не нужно.

crutch_master ★★★★★
()

Подытожу: указатели жизненно необходимы. А недо-ЯП, где указатели отсутствуют, использовать нельзя.

anonymous
()
Ответ на: комментарий от hotpil

Неадекватен как раз ты. Иди, читай K&R!

anonymous
()
Ответ на: комментарий от crutch_master

Ломающие новости просто. Вся история IT начиная с фортрана под срез. Имен, функций, циклов не существует. Всё состоит из наборов чисел, даже монады, даже аллах.

anonymous
()

в некотором смысле адрес переменной - это и есть ее «имя».

conalex ★★★
()
Ответ на: комментарий от crutch_master

Я тут укрепляюсь в мысли, что ассемблер (и скорее всего си) нельзя изучать, пока не окрепнет абстрактное мышление.

anonymous
()
Ответ на: комментарий от anonymous

Процессор имен не понимает

... что, внезапно, не мешает нам пользоваться переменными

...которые, внезапно, сводятся к адресам ячеек памяти.

tailgunner ★★★★★
()
Ответ на: комментарий от tailgunner

Ага. Ну так ответ на вопрос

Почему нельзя обращаться к переменной в динамической памяти по ее имени, а не по адресу?

- можно, просто Ритчи не сделал такой возможности (Страуструп, например, сделал).

anonymous
()
Ответ на: комментарий от anonymous

в исходниках указатель — та же переменная, с которой можно работать по имени.
ну то есть это переменная, значение которой — это адрес в памяти.


ссылки, емнип, отличаются тем, что:
- на них нет математики
- могут содержать признак «неинициализироано»

VladimirMalyk ★★★★★
()
Ответ на: комментарий от anonymous

Почему нельзя обращаться к переменной в динамической памяти по ее имени, а не по адресу?

можно

Нельзя. Все обращения делаются по адресу, даже если имя сначала переводится в адрес.

Страуструп, например, сделал

О чем ты?

tailgunner ★★★★★
()
Последнее исправление: tailgunner (всего исправлений: 1)

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

anonymous
()

Почему нельзя обращаться к переменной в динамической памяти по ее имени, а не по адресу?

Потому что для этого в язык нужно добавить дополнительную сущность - ссылки. Это заметно усложнит синтаксис, т.к. с указателями можно писать *(x+42) или даже x[42], а для ссылок тогда нужно что-то придумывать. Спрашивается, нафига козе баян, если указателей в Си хватает для всего?

no-such-file ★★★★★
()

Указатели дают возможность выбора: обращаться к сущности по адресу или по значению. В языках без указателей такой возможности нет, там обычно для примитивных типов - обращение по значению, для составных - по адресу(ссылки).

anonymous
()
Ответ на: комментарий от i-rinat


Ты изобрёл ссылки из C++


сперва прочитал «Ты изобрел костыли С++» %)

metawishmaster ★★★★★
()
Ответ на: комментарий от tailgunner

Нельзя. Все обращения делаются по адресу, даже если имя сначала переводится в адрес.

Либо я не понимаю вопрос ТС, либо ты.

Объекту в памяти можно назначить имя. В си это поддерживается для глобальных и локальных объектов, и не поддерживается для динамических. Но последнее - исключительно воля Создателя, а не какие-то объективные препятствия. Другой Создатель сделал и это:

T &x = *new T;
Вот - к динамическому объекту можно обращаться по имени, указатели не нужны.

Во что всё это транслируется - отношения не имеет.

// капча haskells woodbine намекае

anonymous
()
Ответ на: комментарий от anonymous

T &x = *new T;

Вот - к динамическому объекту можно обращаться по имени, указатели не нужны.

x - это указатель // К.О.

То, что в Си++ он называется «ссылка» вместо «указатель», ничего не меняет.

tailgunner ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.