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

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

01.11.2023, 17:47. Показов 4987. Ответов 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
Злостный нарушитель
 Аватар для Verevkin
10878 / 5817 / 1288
Регистрация: 12.03.2015
Сообщений: 26,855
02.11.2023, 13:23
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от DrOffset Посмотреть сообщение
Так что это привело к тому, что многие символы из доступных повсеместно стали использовать в разных контекстах, это не только умножение так пострадало.
Пострадавшие символы - это херня. Сколько школоты и студентоты пострадало - вот это проблема. Чувак, который создал эту тему, тоже такой терпила.

0
фрилансер
 Аватар для Алексей1153
6495 / 5724 / 1133
Регистрация: 11.10.2019
Сообщений: 15,286
02.11.2023, 13:25
Verevkin, страдают от языка только те, кому этот язык не нужен. Зачёт только сдать и всё, досвидос
0
19501 / 10106 / 2461
Регистрация: 30.01.2014
Сообщений: 17,825
02.11.2023, 13:26
Приведу здесь ответ создателя языка (Кена Томпсона):
Отсюда: https://softwareengineering.st... 268#273268
near on the keyboard: no.
c copied from b so & and * are same there.
b got * from earlier languages - some assembly,
bcpl and i think pl/1.
i think that i used & because the name (ampersand)
sounds like "address." b was designed to be run with
a teletype model 33 teletype. (5 bit baud-o code)
so the use of symbols was restricted.
Человек так же поинтересовался у него, почему именно & и * были выбраны для операций с указателями в предположении, что они находятся рядом на клавиатуре.
А черным я выделил тот же тезис, который озвучивал выше: символов было не так много, чтобы было из чего выбирать.
1
Злостный нарушитель
 Аватар для Verevkin
10878 / 5817 / 1288
Регистрация: 12.03.2015
Сообщений: 26,855
02.11.2023, 13:32
Цитата Сообщение от DrOffset Посмотреть сообщение
символов было не так много, чтобы было из чего выбирать.
Ну ладно-ладно, чо ты...
Дави по-немножку, крошка. ©
-----
Я так понимаю, в паскале использовалась какая-то другая таблица символов. Это бы многое объяснило.
0
19501 / 10106 / 2461
Регистрация: 30.01.2014
Сообщений: 17,825
02.11.2023, 13:35
Цитата Сообщение от Verevkin Посмотреть сообщение
Я так понимаю, в паскале использовалась какая-то другая таблица символов. Это бы многое объяснило.
Паскалю как непромышленному (изначально) языку не было нужды так сильно завязываться на эти нюансы.
1) Ему не нужно было так сильно экономить память
2) Ему не нужно было запускаться на каждом утюге того времени.
Для нужд обучения студентов достаточно было взять что-то более-менее распространенное.
А дальше эта проблема решилась сама собой введением стандартов на символьные таблицы.
0
фрилансер
 Аватар для Алексей1153
6495 / 5724 / 1133
Регистрация: 11.10.2019
Сообщений: 15,286
02.11.2023, 13:41
Цитата Сообщение от DrOffset Посмотреть сообщение
the name (ampersand)
sounds like "address."
хм, необычный у него слух По мне, так совершенно не созвучно
0
Эксперт функциональных языков программированияЭксперт С++
 Аватар для Royal_X
6296 / 3018 / 1053
Регистрация: 01.06.2021
Сообщений: 11,458
02.11.2023, 13:46
Алексей1153, мне кажется ^ больше похож на указатель, наверное поэтому данный символ нашел применение в C++/CLI.
Хотя, я не против астериска *, вполне красивый символ. Я бы еще добавил в С++ астеризм ⁂
0
Злостный нарушитель
 Аватар для Verevkin
10878 / 5817 / 1288
Регистрация: 12.03.2015
Сообщений: 26,855
02.11.2023, 14:10
Цитата Сообщение от Royal_X Посмотреть сообщение
Я бы еще добавил в С++ астеризм ⁂
И эмодзей побольше!!!
0
Эксперт функциональных языков программированияЭксперт С++
 Аватар для Royal_X
6296 / 3018 / 1053
Регистрация: 01.06.2021
Сообщений: 11,458
02.11.2023, 14:17
Verevkin,
C++
1
int⁂ arr = new int[n];
3
фрилансер
 Аватар для Алексей1153
6495 / 5724 / 1133
Регистрация: 11.10.2019
Сообщений: 15,286
02.11.2023, 16:21
Цитата Сообщение от Royal_X Посмотреть сообщение
астеризм
и как этот метеоризм набирать с клавиатуры, если не запоминать альт+код ?
0
Эксперт функциональных языков программированияЭксперт С++
 Аватар для Royal_X
6296 / 3018 / 1053
Регистрация: 01.06.2021
Сообщений: 11,458
02.11.2023, 16:30
Алексей1153, это же была шутка. Но если не трогать язык, а просто говорить о визуальном восприятии кода при его написании, то все приличные IDE и даже редакторы поддерживают лигатуры. Полагаю, что не составит труда сделать так, чтобы при вводе нескольких последовательных астерисков редактор заменял другим символом (двойным астериском или астеризмом).
0
2 / 2 / 2
Регистрация: 29.06.2018
Сообщений: 139
03.11.2023, 14:18  [ТС]
Цитата Сообщение от KSergey9 Посмотреть сообщение
Как там ТС? указатели осознаны?
Нет. Потому что всё что пытались объяснить ты и Verevkin выглядит как-то противоречиво.

Цитата Сообщение от Verevkin Посмотреть сообщение
Символ "*" обозначает дохрена всего. После имени типа он является ЧАСТЬЮ этого имени, обозначающего тип указателя. Перед именем переменной он означает разыменование указателя.
Цитата Сообщение от Verevkin Посмотреть сообщение
Функция возвращает указатель типа FILE*, который потом можно использовать в функциях файлового ввода/вывода.
Цитата Сообщение от KSergey9 Посмотреть сообщение
На Си (ну и С++ для совместимости) этот код выглядит вообще абсолютно точно также. Только кавычки вместо апострофов, и явное указание типа переменной.
Только у вас параметры функции являются строками.
Как я понял, в C++ можно несколькими способами инициализировать строки:
C++
1
2
3
char str1[255];
std::string str2;
std::wstring str3;
Тут понятно. Но почему 1-й и 2-й параметры функции являясь по сути строками, описаны как const char * fname? То есть есть 4-й способ инициализации строки, ведь адрес строки и адрес 1-го её символа - одно и тоже, то есть можно использовать указатели, но почему тогда в прототипе указатель используется, а в обращении к функции указателя нет?
0
фрилансер
 Аватар для Алексей1153
6495 / 5724 / 1133
Регистрация: 11.10.2019
Сообщений: 15,286
03.11.2023, 14:25
Isur, указатель - это переменная, которая хранит адрес. Что тут сложного?

а тут нет ни одного указателя, зачем этот пример?
Цитата Сообщение от Isur Посмотреть сообщение
C++
1
2
3
char str1[255];
std::string str2;
std::wstring str3;
0
19501 / 10106 / 2461
Регистрация: 30.01.2014
Сообщений: 17,825
03.11.2023, 14:43
Цитата Сообщение от Isur Посмотреть сообщение
ведь адрес строки и адрес 1-го её символа - одно и тоже, то есть можно использовать указатели, но почему тогда в прототипе указатель используется, а в обращении к функции указателя нет?
Потому что массив в С и C++ это такой объект, который в подходящих выражениях приводится к указателю на первый элемент массива.
Кроме того массив в выражениях не копируется, поэтому попытка это копирование произвести, приведет опять же к указателю.
Поэтому функции, в которые передают массив по значению, должны принять либо указатель (на первый элемент), либо ссылку на весь массив (ну это уже как и со всеми остальными типами единообразно работает).
0
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
13210 / 6843 / 1824
Регистрация: 18.10.2014
Сообщений: 17,306
03.11.2023, 18:28
Цитата Сообщение от Isur Посмотреть сообщение
Как я понял, в C++ можно несколькими способами инициализировать строки:
C++
1
2
3
char str1[255];
std::string str2;
std::wstring str3;
Не ясно, почему вы здесь используете термин "инициализировать". Откуда вы взяли это слово и что по-вашему оно значит? Ни одна строка в примере выше не инициализирована, по крайней мере явно.

Цитата Сообщение от Isur Посмотреть сообщение
Только у вас параметры функции являются строками.
Тут понятно. Но почему 1-й и 2-й параметры функции являясь по сути строками, описаны как const char * fname?
Потому что эти парамептры НЕ являются строками. Приведенная функция взята из стандартной библиотеки языка С. В языке С вообще не бывает функций, параметры который являются строками. При работе со строками в языке С используются функции, параметры которых являются указателями на начало строки. Именно такой пример вам и привели.

Именно указатели на начало строки в данном случае и описаны как const char * fname.

Цитата Сообщение от Isur Посмотреть сообщение
То есть есть 4-й способ инициализации строки,
Опять непонятно что ту делающее слово "инициализация"... И нет, никакого "4-го способ инициализации строки" тут нет. Из-за этой "инициализации" вообще не понятно, о чем вы ведете речь.

Цитата Сообщение от Isur Посмотреть сообщение
Ведь адрес строки и адрес 1-го её символа - одно и тоже, то есть можно использовать указатели, но почему тогда в прототипе указатель используется, а в обращении к функции указателя нет?
Как это нет? Есть. Оно просто присутствует неявно, поэтому вы его не заметили.

Любой массив в языке С имеет свойство автоматически конвертироваться в указатель. Например, строковый литерал "Hello" - это массив. Если вам хочется получить указатель на его нулевой элемент вы можете сделать это явно как &"Hello"[0] - это совершенно легальный код. Но на самом деле выписывать такую конструкцию совсем не обязательно, ибо сам массив почти (почти!) всегда умеет неявно, т.е. сам по себе, приводиться к указателю на свой нулевой элемент. То есть если вам нужно вызвать функцию foo(const char *str) и передать туда указатель на начало строки "Hello", вы можете вызвать ее как foo(&"Hello"[0]), а можете просто вызвать ее как foo("Hello"). Это одно и то же.
0
2784 / 1937 / 570
Регистрация: 05.06.2014
Сообщений: 5,602
03.11.2023, 22:18
Цитата Сообщение от Isur Посмотреть сообщение
Как должна выглядеть эта строка в C++и самое главное почему она так выглядеть должна? Если тип 1-го и 2-го параметров не строка, а указатель на символ это как?
1) Не C++, а Си.
2) Если функция будет принимать объект типа "строка", этот объект придется как-то инициализировать. Причем, не выходя за рамки идеологии Си "абы как, токмо не как в Плюсах" (потому что если скопировать в Си решения из Плюсов, получатся Плюсы). А единственный способ это сделать - дергать конструкторы-деструкторы вручную.
3) Значительная часть стандартных сишных функций может подгружаться из системных dll-ок и их линуксовых аналогов. А там разнобой со стандартами передачи вышеупомянутых объектов в функцию. Один компилятор передает так, другой сяк и друг друга они не понимают. Так что, если функция должна грузиться из dll-ки, проще делать все на указателях.
0
Модератор
Эксперт Pascal/DelphiЭксперт NIX
 Аватар для bormant
7818 / 4637 / 2837
Регистрация: 22.11.2013
Сообщений: 13,159
Записей в блоге: 1
03.11.2023, 22:38
Цитата Сообщение от Алексей1153 Посмотреть сообщение
указатель - это переменная, которая хранит адрес. Что тут сложного?
Смотря для кого. Как минимум, то, что это не обязательно переменная
C++
1
2
  int p;
  printf("%p",&p);
&p -- указатель на p, но "&p" -- это выражение, а не переменная.
0
фрилансер
 Аватар для Алексей1153
6495 / 5724 / 1133
Регистрация: 11.10.2019
Сообщений: 15,286
03.11.2023, 22:42
bormant, да, сам адрес тоже называют указателем Но для ТС это только усложнение укладывания в голове сейчас.
0
Злостный нарушитель
 Аватар для Verevkin
10878 / 5817 / 1288
Регистрация: 12.03.2015
Сообщений: 26,855
03.11.2023, 23:16
Цитата Сообщение от Алексей1153 Посмотреть сообщение
Но для ТС это только усложнение укладывания в голове сейчас.
Все уже давно забили на ТСа, даже он сам.
0
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9007 / 4708 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
04.11.2023, 08:01
Цитата Сообщение от Алексей1153 Посмотреть сообщение
можно предположить экономию памяти (тогда её было немного), занимаемой текстом программы
Контекстное использование символов операций связано, в основном, с ограничением количества ключевых слов. Экономия памяти может довести до простого соображения о том, что в языке должно быть два символа: 0 и 1. И еще может быть пробел.
Цитата Сообщение от Isur Посмотреть сообщение
Указатель - это объект, который связан с адресом памяти, верно? А если перед указателем поставить значок амперсенда - то такая запись будет означать сам адрес памяти.
Тип "указатель на тип", это тип сам по себе. Например:
C++
1
2
3
4
int target=123;
int *pointer_to_target = ⌖ //объявлена переменная типа "указатель на int" и инициализирована адресом переменной типа "int"
 
int ** pointer_to_pointer_to_target = &pointer_to_target;//у указателя как и у любой переменной любого типа есть адрес и его тоже можно использовать как переменную.
Цитата Сообщение от Isur Посмотреть сообщение
А если перед указателем поставить значок амперсенда
Isur, тут затронули вопрос роли проф. Преображенского в С++ и я хочу добавить, что в контекстно-ориентированном языке (а других не бывает, кстати) очень важно видеть контекст чтобы понять "кто на ком стоял". Амперсанд, в частности, может быть частью объявления ссылки, побитовой операцией или частью логической операции &&. Это помимо операции взятия адреса.
В западно-научно-технической практике, создание новой и малопонятной терминологии сопровождает, практически, любую вновь возникшую технологию. Это связано в основном с тем, что создатели хотят плюшек за разъяснения. Пишутся книги, технология развивается авторами пока конкуренты изнемогают в изучении, бизнес несёт деньги авторам за услуги по применению (время-деньги).
Если вспомнить такие вещи как sudo, grep, touch, cat и пр. и пр., то удивляться не чему, Нужно учить. Впереди ещё много интересностей типа константности верхнего и нижнего уровня, итераторы, которые абстрагируют указатели инвалидным с точки зрения синтаксиса данных видов константности, способом. Умные указатели там же. Учите и практикуйте. В сети полно информации, а вы продолжаете искать, где ещё почитать. Это не плохо, но без попыток что-то писать и смотеть на результат, это не работает.
ps array-to-pointer conversion и указатели на char в смысле строк C пока не трогайте.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
04.11.2023, 08:01

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

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
60
Ответ Создать тему
Новые блоги и статьи
В чем ценность человеческого опыта в глобальном смысле?
kumehtar 03.07.2026
Возможно, ценность человека не в том, что он однажды достигает мудрости, а в том, что он становится носителем карты пути. Он знает не только истину, но и последовательность внутренних изменений,. . .
интеграция AnyLogic с самописным REST API и переход на Odoo
anaschu 03.07.2026
Успешная интеграция AnyLogic с самописным REST API и переход на промышленную Odoo WMS Сегодня проделал огромный путь от простой симуляции физических процессов до построения полноценной. . .
Поиск всех путей на ориентированном графе. Linux
dcc0 02.07.2026
Переработка старого кода из моей статьи. Через несколько переработок от PHP кода к C89 (надеюсь, 89). Но довольно запутанно получилось. Код для Linux. Но если убрать time и то, что с ним. . .
Сам себя обучал rest api
anaschu 02.07.2026
Педагогический лайфхак: Почему чистый REST API для ученика намного круче, чем готовые библиотеки Когда мы отказались от капризного JAR-файла AnyLogic и переписали код на стандартный HttpClient,. . .
rest api anylogic - выполнение модели на своём русском сайте
anaschu 02.07.2026
Как подружиться с AnyLogic Cloud API, победить провайдеров и развернуться Java-бэкенд в Docker на бесплатном хостинге: Двухдневный лог борьбы Всем привет! Хочу поделиться свежим (и довольно. . .
Где деньги лежат
kumehtar 02.07.2026
Это - японская подводная лодка I-52 (тип C2, кодовое имя Momi) вышла из Японии в марте 1944 года с миссией в оккупированную немцами Францию (Лорьян). Это была одна из «Янаги»-миссий по обмену. . .
Krabik для WoW 3.3.5a, многоязычный
AmbA 02.07.2026
Допилил бота, думаю что окончательно. Изменения: - добавлена многоязычность - добавлено снятие скриншотов - добавлено поддержание бафов хождения по воде (для жреца, дк и шамана) - и так, по. . .
Алиса нашла кучу ошибок компиляции и запуска в проекте, который без проблем компилировался и запускался)))
anaschu 30.06.2026
Я пока посмеюся, но завтра проверю. А вообще интерсно. Дал алисе файл, в котором точно нет ошибок компиляции и запуска, и попросил их найти. Нашла кучу))) Критические ошибки, мешающие компиляции и. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru