260 / 208 / 99
Регистрация: 13.12.2015
Сообщений: 1,098
1

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

05.02.2016, 20:09. Показов 620. Ответов 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// как хотелось бы ожидать по вышеизложенной логике
говорим указатель - подразумеваем массив.
какую книгу надо прочитать, чтобы свободно владеть этим аппаратом? неужели зубрежка?
люди, кто-нибудь, дайте совет
фото к вопросу о том что указатель выглядит в отладчике как структура
0
Миниатюры
Указатели (Pointers)  
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
05.02.2016, 20:09
Ответы с готовыми решениями:

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

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

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

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

3
maxillion
05.02.2016, 20:26
  #2

Не по теме:

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

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

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

Цитата Сообщение от SergioO Посмотреть сообщение
какую книгу надо прочитать, чтобы свободно владеть этим аппаратом?
Ничего сложного нет на самом деле. Не паникуйте. Просто торопиться не нужно - тема обширная.
0
15051 / 8070 / 1940
Регистрация: 30.01.2014
Сообщений: 13,684
05.02.2016, 21:18 4
Вот чем плохи такие огромные посты-вопросы, чтобы на них ответить - нужно потратить больше времени, чем ТС на его написание. Это отталкивает.
Цитата Сообщение от 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
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
05.02.2016, 21:18

Помощь в написании контрольных, курсовых и дипломных работ здесь.

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.