С Новым годом! Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.59/22: Рейтинг темы: голосов - 22, средняя оценка - 4.59
2 / 2 / 2
Регистрация: 29.06.2018
Сообщений: 129

Не понимаю указатели

01.11.2023, 17:47. Показов 4735. Ответов 93
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Почитал всякое, понял, что указатели я скорее не понимаю чем понимаю.
Указатель - это объект, который связан с адресом памяти, верно? А если перед указателем поставить значок амперсенда - то такая запись будет означать сам адрес памяти.
А вот описание функции fopen() http://cppstudio.com/post/1253/
C++
1
FILE * fopen( const char * fname, const char * modeopen );
Параметры функции имеют тип указатель, сама функция тоже возвращает тип указатель. На этом собственно всё понимание и заканчивается. Если сравнивать c аналогичной функцией fopen() в языке PHP, то в PHP вызов функции выглядел бы так:
PHP
1
fhandle=fopen('/home/user/list.txt', 'r');
Как должна выглядеть эта строка в C++и самое главное почему она так выглядеть должна? Если тип 1-го и 2-го параметров не строка, а указатель на символ это как? И как должна будет выглядеть строка инициализации переменной fhandle, что-то типа
C++
1
FILE * fhandle;
у меня эта строка вызывает ошибку
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
01.11.2023, 17:47
Ответы с готовыми решениями:

Указатели. Не понимаю
Разбираю указатели, слегка запнулся на одном месте. У меня есть функция: void Dit(int &x) { x *= 2; } Использую я...

не совсем понимаю код *указатели
изучаю указатели, столкнулся с кодом не совсем могу понять что происходит в функции *g_s, особенно это условие *p2 && *p2 == *p ...

Правильно ли я понимаю ссылки и указатели. Работу с ними. Я сам прокомментировал код. Скажите правильно или нет.
#pragma once namespace Casper { class Cat { private: unsigned int age; float weight;

93
 Аватар для FFPowerMan
2156 / 1236 / 508
Регистрация: 11.10.2018
Сообщений: 6,240
01.11.2023, 17:51
Указатель - это и есть адрес памяти.
0
Злостный нарушитель
 Аватар для Verevkin
10249 / 5676 / 1262
Регистрация: 12.03.2015
Сообщений: 26,307
01.11.2023, 17:53
Цитата Сообщение от Isur Посмотреть сообщение
Указатель - это объект, который связан с адресом памяти, верно?
Указатель - это переменная (ячейка памяти размером 4 или 8 байт), содержащая начальный адрес чего-нибудь в этой же памяти.
Цитата Сообщение от Isur Посмотреть сообщение
А если перед указателем поставить значок амперсенда - то такая запись будет означать сам адрес памяти.
Получишь адрес, в котором расположена сама переменная (ячейка памяти размером 4 или 8 байт), содержащая начальный адрес чего-нибудь в этой же памяти.

Добавлено через 1 минуту
Цитата Сообщение от Isur Посмотреть сообщение
Как должна выглядеть эта строка в C++и самое главное почему она так выглядеть должна?
А ты чего там рожаешь-то? Понять работу с указателямии можно только на практике.
0
 Аватар для FFPowerMan
2156 / 1236 / 508
Регистрация: 11.10.2018
Сообщений: 6,240
01.11.2023, 17:53
Амперсанд перед переменной - это операция взятия и адреса от этой переменной и запись в указатель, т.е. в другую переменную
0
2 / 2 / 2
Регистрация: 29.06.2018
Сообщений: 129
02.11.2023, 10:18  [ТС]
Цитата Сообщение от Verevkin Посмотреть сообщение
А ты чего там рожаешь-то? Понять работу с указателямии можно только на практике.
Пытаюсь программу, написанную мной ранее на PHP переписать на C++
Цитата Сообщение от Verevkin Посмотреть сообщение
Получишь адрес, в котором расположена сама переменная (ячейка памяти размером 4 или 8 байт), содержащая начальный адрес чего-нибудь в этой же памяти.
Так ещё раз, амперсанд перед переменной или переменной указателем - это адрес памяти.
Звёздочка между типом и переменной при инициации последней - это обозначение что переменная является указателем.
А как тогда понимать зачем нужны указатели в прототипе функции fopen() ?
0
Злостный нарушитель
 Аватар для Verevkin
10249 / 5676 / 1262
Регистрация: 12.03.2015
Сообщений: 26,307
02.11.2023, 10:31
Цитата Сообщение от Isur Посмотреть сообщение
Пытаюсь программу, написанную мной ранее на PHP переписать на C++
Не надо так делать. Надо сформулировать ТЗ и написать на целевом языке с нуля.
Цитата Сообщение от Isur Посмотреть сообщение
Так ещё раз, амперсанд перед переменной или переменной указателем - это адрес памяти.
Да, "&" перед "чем-то" – это оператор чтения начального адреса этого "чего-то" в памяти.
Цитата Сообщение от Isur Посмотреть сообщение
Звёздочка между типом и переменной при инициации последней - это обозначение что переменная является указателем.
Я считаю, что создатели языка Си с этим оператором ("*") сильно облажались. Такое написание сильно дезориентирует новичков. Символ "*" обозначает дохрена всего. После имени типа он является ЧАСТЬЮ этого имени, обозначающего тип указателя. Перед именем переменной он означает разыменование указателя.
C
1
2
int* x; // объявление переменной-указателя
*x = 5; // разыменование указателя (запись данных по адресу)
Ненавижу за это Си-подобные языки. В паскале всё по-человечески с этими делами.
Цитата Сообщение от Isur Посмотреть сообщение
А как тогда понимать зачем нужны указатели в прототипе функции fopen() ?
Функция возвращает указатель типа FILE*, который потом можно использовать в функциях файлового ввода/вывода.
0
фрилансер
 Аватар для Алексей1153
6447 / 5643 / 1128
Регистрация: 11.10.2019
Сообщений: 15,016
02.11.2023, 10:44
Цитата Сообщение от Isur Посмотреть сообщение
Пытаюсь программу, написанную мной ранее на PHP переписать на C++
а при чём тут указатели?
Можно и без указателей программы писать

Цитата Сообщение от Isur Посмотреть сообщение
PHP
1
fhandle=fopen('/home/user/list.txt', 'r');
C++
1
2
//#include <fstream>
std::ifstream fhandle{"/home/user/list.txt"};

Добавлено через 2 минуты
Цитата Сообщение от Verevkin Посмотреть сообщение
сильно облажались
Ну, не хватило на всё уникальных значков в ascii
0
631 / 526 / 104
Регистрация: 05.08.2022
Сообщений: 2,810
02.11.2023, 10:49
Цитата Сообщение от Isur Посмотреть сообщение
то в PHP вызов функции выглядел бы так:
На Си (ну и С++ для совместимости) этот код выглядит вообще абсолютно точно также. Только кавычки вместо апострофов, и явное указание типа переменной. (хотя в C++ уже и тип можно не писать, просто auto)

C++
1
FILE * fhandle = fopen("/home/user/list.txt", "r");
Добавлено через 1 минуту

Не по теме:

Цитата Сообщение от Isur Посмотреть сообщение
PHP
1
fhandle=fopen('/home/user/list.txt', 'r');
А в PHP перед переменной $ не нужен? просто уточняю, я не очень в теме.

0
Злостный нарушитель
 Аватар для Verevkin
10249 / 5676 / 1262
Регистрация: 12.03.2015
Сообщений: 26,307
02.11.2023, 10:53
Цитата Сообщение от Алексей1153 Посмотреть сообщение
Ну, не хватило на всё уникальных значков в ascii
У всех хватило, а у них - НЕТ.
0
19491 / 10097 / 2460
Регистрация: 30.01.2014
Сообщений: 17,805
02.11.2023, 11:14
Цитата Сообщение от Verevkin Посмотреть сообщение
У всех хватило, а у них - НЕТ.
У кого у всех?
Вот, для справки: https://en.wikipedia.org/wiki/ISO/IEC_646
Там см. таблицу "Variant comparison chart".
Из нее видно, что не все символы были одинаково доступны.
А т.к. язык С - это промышленный язык программирования, задача была в том, что иметь наименьшие проблемы совместимости.
Отсюда в языке такой минимализм, и отсюда у него поддерживались такие вещи как диграфы и триграфы.

Так что это не "облажались", а в тех условиях выбрали "наименее проблемное решение".
Да и с позиции современных изнеженных "новичков" нечего судить. Им под нос ответ сунь - все равно есть шанс, что не поймут.
0
Злостный нарушитель
 Аватар для Verevkin
10249 / 5676 / 1262
Регистрация: 12.03.2015
Сообщений: 26,307
02.11.2023, 11:22
Цитата Сообщение от DrOffset Посмотреть сообщение
Там см. таблицу "Variant comparison chart".

Цитата Сообщение от DrOffset Посмотреть сообщение
Так что это не "облажались", а в тех условиях выбрали "наименее проблемное решение".
Наименее проблемное? Оператор "*" выполняет 4 разных операции в зависимости от контекста. В паскале такой херни нет, например.
0
фрилансер
 Аватар для Алексей1153
6447 / 5643 / 1128
Регистрация: 11.10.2019
Сообщений: 15,016
02.11.2023, 11:27
Цитата Сообщение от Verevkin Посмотреть сообщение
В паскале
ну, ты бы ещё бейсик упомянул
0
Злостный нарушитель
 Аватар для Verevkin
10249 / 5676 / 1262
Регистрация: 12.03.2015
Сообщений: 26,307
02.11.2023, 11:34
Цитата Сообщение от Алексей1153 Посмотреть сообщение
ну, ты бы ещё бейсик упомянул
Зачем?
И чо не так с паскалем? Я на Delphi 24 года работаю.
И некисло зарабатываю.
0
Эксперт функциональных языков программированияЭксперт С++
 Аватар для Royal_X
6147 / 2840 / 1040
Регистрация: 01.06.2021
Сообщений: 10,353
02.11.2023, 11:38
DrOffset, если не хватало символов, то можно же было использовать несколько, как в Algol 68 вместо * пишут ref.
Вообще, в предке в разы понятнее, например, выделение памяти для переменной из кучи:
Вместо
C++
1
int* x = new int;
пишем
Code
1
ref int x = heap int;
или можно ещё короче
Code
1
heap int x;
1
19491 / 10097 / 2460
Регистрация: 30.01.2014
Сообщений: 17,805
02.11.2023, 11:41
Цитата Сообщение от Verevkin Посмотреть сообщение
Наименее проблемное?
Да, с учетом стоящих задач, наименее проблемное.
Поэтому сейчас полмира именно на С написано, а не на паскале, например.

Цитата Сообщение от Verevkin Посмотреть сообщение
Оператор "*" выполняет 4 разных операции в зависимости от контекста. В паскале такой херни нет, например.
Ну правильно, потому что изначальные задачи этих языков были разные.

Добавлено через 2 минуты
Цитата Сообщение от Royal_X Посмотреть сообщение
DrOffset, если не хватало символов, то можно же было использовать несколько, как в Algol 68 вместо * пишут ref.
История не терпит сослагательного наклонения.
Язык Algol уже был на момент создания С.
0
фрилансер
 Аватар для Алексей1153
6447 / 5643 / 1128
Регистрация: 11.10.2019
Сообщений: 15,016
02.11.2023, 11:43
Цитата Сообщение от Verevkin Посмотреть сообщение
И некисло зарабатываю
значит, как миллиардер, сможешь повлиять на комитет стандартизации C++

Verevkin, по большому счёту, вынос мозга только на cdecl может приключиться, остальное считывается человеком относительно легко
0
Злостный нарушитель
 Аватар для Verevkin
10249 / 5676 / 1262
Регистрация: 12.03.2015
Сообщений: 26,307
02.11.2023, 11:44
Цитата Сообщение от DrOffset Посмотреть сообщение
Поэтому сейчас полмира именно на С написано, а не на паскале, например.
Не поэтому.
Цитата Сообщение от DrOffset Посмотреть сообщение
изначальные задачи этих языков были разные.
Согласен. Но не понимаю, зачем так сделали. В интернетах ходит байка, что язык Си был создан ради шутки.
0
631 / 526 / 104
Регистрация: 05.08.2022
Сообщений: 2,810
02.11.2023, 11:45

Не по теме:

Есть ролик "Уральских пельменей" про русский язык про Кирилла и Мифодия
Думаю, с минимальными изменениями сценарий подошел бы и для диалога Кернигана с Риччи



Как там ТС? указатели осознаны?
0
фрилансер
 Аватар для Алексей1153
6447 / 5643 / 1128
Регистрация: 11.10.2019
Сообщений: 15,016
02.11.2023, 11:47
Цитата Сообщение от Verevkin Посмотреть сообщение
зачем так сделали
можно предположить экономию памяти (тогда её было немного), занимаемой текстом программы
0
Злостный нарушитель
 Аватар для Verevkin
10249 / 5676 / 1262
Регистрация: 12.03.2015
Сообщений: 26,307
02.11.2023, 11:49
Цитата Сообщение от Алексей1153 Посмотреть сообщение
можно предположить экономию памяти (тогда её было немного), занимаемой текстом программы
Ну ладно тебе, не до такой же степени!
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
02.11.2023, 11:49
Помогаю со студенческими работами здесь

не понимаю указатели
выводится а=5, b=22, c=22, правильно ли это? подскажите, как изменится поведение приложения если все указатели создавать через ...

Не понимаю как переделать переменные в указатели
Дали такое задание и не могу ничего понять Программа конвертирует введенный текст с английского на русский (транслит), нужно поменять...

не понимаю как делать. Динамические масивы, указатели и работа с ними
не понимаю как делать, мне сказали через if, но меня это еще больше запутало, нет идей вообще! в четверг последний срок сдачи ...

Нужно отредачить код, добавив указатели и разделив исходную функцию на две. Как это сделать - я не особо понимаю :(
Нужно отредачить код, добавив указатели и разделив исходную функцию на две. Как это сделать - я не особо понимаю :( #include...

Указатели и указатели на указатели, а также типы данных
Недавно начал изучать Си, перешел с Delphi. Много непонятного и пока процесс идет медленно. Накачал литературы, буду изучать) Щас...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Модель микоризы: классовый агентный подход 3
anaschu 06.01.2026
aa0a7f55b50dd51c5ec569d2d10c54f6/ O1rJuneU_ls https:/ / vkvideo. ru/ video-115721503_456239114
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR
ФедосеевПавел 06.01.2026
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR ВВЕДЕНИЕ Введу сокращения: аналоговый ПИД — ПИД регулятор с управляющим выходом в виде числа в диапазоне от 0% до. . .
Модель микоризы: классовый агентный подход 2
anaschu 06.01.2026
репозиторий https:/ / github. com/ shumilovas/ fungi ветка по-частям. коммит Create переделка под биомассу. txt вход sc, но sm считается внутри мицелия. кстати, обьем тоже должен там считаться. . . .
Расчёт токов в цепи постоянного тока
igorrr37 05.01.2026
/ * Дана цепь постоянного тока с сопротивлениями и напряжениями. Надо найти токи в ветвях. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа и решает её. Последовательность действий:. . .
Новый CodeBlocs. Версия 25.03
palva 04.01.2026
Оказывается, недавно вышла новая версия CodeBlocks за номером 25. 03. Когда-то давно я возился с только что вышедшей тогда версией 20. 03. С тех пор я давно снёс всё с компьютера и забыл. Теперь. . .
Модель микоризы: классовый агентный подход
anaschu 02.01.2026
Раньше это было два гриба и бактерия. Теперь три гриба, растение. И на уровне агентов добавится между грибами или бактериями взаимодействий. До того я пробовал подход через многомерные массивы,. . .
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост. Налог на собак: https:/ / **********/ gallery/ V06K53e Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf Пост отсюда. . .
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop? Ниже её машинный перевод. После долгих разбирательств я наконец-то вернула себе. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru