С Новым годом! Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.50/6: Рейтинг темы: голосов - 6, средняя оценка - 4.50
 Аватар для SergioO
261 / 209 / 99
Регистрация: 13.12.2015
Сообщений: 1,098

Указатели (Pointers)

05.02.2016, 20:09. Показов 1168. Ответов 3
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте.
Решил углубленно изучить указатели.
Скачал несколько книг, лекций, тестов именно по указателям.
Возник ряд вопросов, поэтому я не стал для каждого вопроса заводить отдельный топик, а решил задать все вопросы здесь.
1.
C++
1
2
3
char *pc = "0123456789", c;
c = ++*pc;
// вызывает ошибку, причем ошибку времени исполнения, компилятор не ругается
операторы "префиксный ++" и "*" имеют один приоритет и выполняются справа-налево, ++ пытается увеличить разыменованный pc (*pc), те
C++
1
*pc +=1;
такой же код работает
C++
1
2
3
char c = '0';
c+=1;
cout << c << endl;
и такой тоже
C++
1
2
3
char c[] = "01234";
c[0]+=1;
cout << c[0] << endl;
объясните в чем ошибка
C++
1
2
c = ++*pc;// ошибка
c= *pc++; // нет ошибки
справа-налево, слева-направо... как вообще операции выполняются?
вроде когда казалось что все понятно, начались сложности.
приоритет 2 ++ -- Суффиксальный/постфиксный инкремент и декремент Слева-направо
приоритет 3 * Indirection (разыменование) Справа-налево
C++
1
*cp++
перезанимался что ли?
в математике почему-то нет таких "парадоксов", как-то все логично и объяснимо, а тут чего-то "магия" какая-то
или какие книги читать надо чтобы это понимать на уровне логики, а не зубрежки
или типа
C++
1
2
int a[10];
a++; /*Illegal; can’t change a constant*/
а константный указатель?
почему? где такое сказано?
Вопрос
2.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
char *pc = "0123456789", c;
    
cout << pc << endl;
 
c = *pc++;
cout << c << endl;
cout << pc << endl;
    
c = *pc++;
cout << c << endl;
cout << pc << endl;
 
c = *pc++;
cout << c << endl;
cout << pc << endl;
0123456789
0
123456789
1
23456789
2
3456789
это что?
почему на просьбу напечатать указатель pc мне дают массив от текущего положения указателя и до конца массива?

Вопрос
3.
C++
1
2
3
char *names[] = {"Miller" , "Jones" , "Anderson" };
 printf("%c\n" , *(*(names+1)+2));
 printf("%c\n" , names[1][2]);
получается все к чему указатель "прикасается" становится массивом, а если массивом уже было, размерность добавляется... хотя указатель на указатель и... указатель на указатель тоже массив указателей формирует.
смотрите фото
указатель это структура? вроде ж нет и sizeof возвращает 4 байта...(размер может быть и другим, но никакой структуры там не видно)

Arrays of Pointers
• Used to build tabular structures
• Indirection “* ” has lower precedence than “[]”
• Declare array of pointers to strings
C++
1
2
char *line[100];
char *(line[100]);
• Reference examples
C++
1
2
line[i] /*refers to thei-th string*/
*line[i] /*refers to the0-th char of thei-th string*/
снова "магия". по-идее, да [] больший приоритет и *line[100] указатель на массив - ан-нет, это массив указателей
тогда логичнее было бы иметь
C++
1
char*  line[100] // например
тогда понятно вроде, что есть массив из 101 элемента типа char*, но тогда какого ляда

C++
1
int *n, *m
, а не
C++
1
int* n, m// как хотелось бы ожидать по вышеизложенной логике
говорим указатель - подразумеваем массив.
какую книгу надо прочитать, чтобы свободно владеть этим аппаратом? неужели зубрежка?
люди, кто-нибудь, дайте совет
фото к вопросу о том что указатель выглядит в отладчике как структура
Миниатюры
Указатели (Pointers)  
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
05.02.2016, 20:09
Ответы с готовыми решениями:

указатели (Pointers)
Напишите функцию, которая будет проверять, если подстрока &quot;IPRE&quot; можно найти в данной линии. Вход: Первая строка содержит одну...

Указатели (pointers) и их практический смысл?
Добрый день, будьте добры, пожалуйста, объясните - вот я сейчас читаю про указатели (*pointers или &amp;pointers). В практике они...

Pointers
Здравствуйте, не могу понять принцип указателей, можете пожалуйста объяснить почему в этом коде int main() { int somenumber; ...

3
05.02.2016, 20:26

Не по теме:

Как говорит википедия

Язык содержит опасные возможности, существенно снижающие качество программ сразу по всем показателям :D

0
Эксперт PHP
 Аватар для Kerry_Jr
3106 / 2591 / 1219
Регистрация: 14.05.2014
Сообщений: 7,236
Записей в блоге: 1
05.02.2016, 20:55
1.
Цитата Сообщение от SergioO Посмотреть сообщение
C++
1
2
3
char *pc = "0123456789", c;
c = ++*pc;
// вызывает ошибку, причем ошибку времени исполнения, компилятор не ругается
Строка в кавычках является константой, компилятор должен был вам выдать предупреждение о запрете преобразования из const char* в char*.
2. Указатель на символ обрабатывается иначе. При выводе указателя на символ будут выводится данные начиная с данной позиции и до тех пор, пока не встретится нулевой байт.
3. см. п.2.

Цитата Сообщение от SergioO Посмотреть сообщение
какую книгу надо прочитать, чтобы свободно владеть этим аппаратом?
Ничего сложного нет на самом деле. Не паникуйте. Просто торопиться не нужно - тема обширная.
0
19491 / 10097 / 2460
Регистрация: 30.01.2014
Сообщений: 17,805
05.02.2016, 21:18
Вот чем плохи такие огромные посты-вопросы, чтобы на них ответить - нужно потратить больше времени, чем ТС на его написание. Это отталкивает.
Цитата Сообщение от SergioO Посмотреть сообщение
// вызывает ошибку, причем ошибку времени исполнения, компилятор не ругается
Ясное дело. Кто ж разрешал менять строковый литерал. В компиляторе следует включить уровень предупреждений на максимум, иначе он следует legacy правилам из более слаботипизированного Си для таких случаев (с точки зрения С++ код с приведением строкового литерала (который константный массив) к указателю на неконстанту - некорректен).

Цитата Сообщение от SergioO Посмотреть сообщение
объясните в чем ошибка
C++
1
2
c = ++*pc;// ошибка
c= *pc++; // нет ошибки
Первый случай: разыменовывали указатель на начало, увеличили содержимое (которое нельзя менять).
Второй случай, увеличили указатель, разыменовывали предыдущее значение. Записи в read-only память не было. Ошибки - нет.
Первый случай для эквивалентности семантики нужно так записывать:
C++
1
c = *++pc;
Цитата Сообщение от SergioO Посмотреть сообщение
а константный указатель?
Нет. а - массив.
Цитата Сообщение от SergioO Посмотреть сообщение
чтобы это понимать на уровне логики
Надо понимать, что массив и указатель - разные типы. Это вполне возможно на уровне логики.
Цитата Сообщение от SergioO Посмотреть сообщение
почему на просьбу напечатать указатель pc мне дают массив от текущего положения указателя и до конца массива?
Потому что так работает operator << для cout. Воспринимает char * как нуль-терминированную строку и выводит ее всю, до этого самого терминального нуля. Хочешь адрес - приводи к void *

Цитата Сообщение от SergioO Посмотреть сообщение
получается все к чему указатель "прикасается" становится массивом
Нет, указатель остается указателем. Для понимания этого кода читать по теме "арифметика указателей".
Кроме того, в примере с names сам names - массив, его элементы - указатели.

Цитата Сообщение от SergioO Посмотреть сообщение
снова "магия"
А здесь нужно просто разобраться как работает декларация в С\С++.
Можно здесь: http://c-faq.com/decl/spiral.anderson.html

Добавлено через 16 минут
И в качестве компилятора лучше используй Сlang. Он по многим вопросам просто сразу тебе подскажет. Не будет умалчивать о проблемах.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
05.02.2016, 21:18
Помогаю со студенческими работами здесь

Smart pointers
Уважаемые форумчане, такой вопрос: возможно ли как то в одном контейнере (в векторе например) хранить shared_ptr и указатели на lvalue....

C++: pointers, clases
Помогите, пожалуйста написать код для задачки Создать программу на языке С++, используя объектно-ориентированные средства...

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

Const, pointers, reference
const int&amp; const ref1; const int &amp;ref1; int const &amp;ref1; Во всех случаях это константная ссылка или ссылка на константу(мне,...

Pointers and dynamic arrays
Изучаю тему указатели и динамичесские массивы в классах. Хотелось бы быть уверенным в следующих ответах: 1) Когда класс использует...


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

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Новые блоги и статьи
Новый 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? Ниже её машинный перевод. После долгих разбирательств я наконец-то вернула себе. . .
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод Нашел на реддите интересную статью под названием The Thinkpad X220 Tablet is the best budget school laptop period . Ниже её машинный перевод. Thinkpad X220 Tablet —. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru