Вопросы с тегом 'pointer-arithmetic'

Вы можете выполнить ограниченное число арифметических операций над указателями. Эти операции: приращение, уменьшение, сложение, вычитание, сравнение и присвоение.
18
ответов

С массивами, почему это так, [5] == 5 [a]?

Как указывает Джоэл в подкасте Qaru # 34, на языке программирования C (aka: K & R) упоминается это свойство массивов в C: a[5] == 5[a] Джоэл говорит, что это из-за арифметики указателя, но я до сих пор не понимаю. Почему a[5] == 5[a]?
задан 19 дек. '08 в 20:01
8
ответов

Арифметика указателя для указателя void в C

Когда указатель на определенный тип (скажем int, char, float,..) увеличивается, его значение увеличивается на размер этого типа данных. Если указатель void, который указывает на данные размера x, увеличивается, как он достигает точки x байтов вперед...
задан 19 авг. '10 в 18:05
8
ответов

Массив-синтаксис против синтаксиса указателя и генерации кода?

В книге "Понимание и использование указателей С" Ричарда Риса говорится на стр. 85, int vector[5] = {1, 2, 3, 4, 5}; Код, сгенерированный vector[i], отличается от кода, генерируемого *(vector+i). vector[i] нотации vector[i] генерирует машинный ко...
задан 17 июля '18 в 8:00
7
ответов

Арифметика указателей

Есть ли у кого-нибудь хорошие статьи или объяснения (блоги, примеры) для арифметики указателя? Рисунок аудитории - куча Java-программистов, изучающих C и С++.
задан 27 дек. '08 в 10:10
5
ответов

Позволяет ли стандарт C назначать произвольное значение указателю и увеличивать его?

Является ли поведение этого кода хорошо определенным? #include <stdio.h> #include <stdint.h> int main(void) { void *ptr = (char *)0x01; size_t val; ptr = (char *)ptr + 1; val = (size_t)(uintptr_t)ptr; printf("%zu\n...
задан 28 июня '18 в 15:48
5
ответов

Для указателя p, может ли p <p + 1 быть ложным в крайнем случае?

Возможно ли для переменной указателя p, что p < (p + 1) является ложным? Пожалуйста, объясните свой ответ. Если да, при каких обстоятельствах это может случиться? Мне было интересно, может ли p + 1 переполняться и быть равно 0. Например. Н...
задан 03 дек. '14 в 16:30
11
ответов

Доступ к значениям массива посредством арифметики указателя и подписи в C

Я продолжаю читать, что в C, используя арифметику указателя, как правило, быстрее, чем подписи для доступа к массиву. Это правда даже с современными (предположительно оптимизирующими) компиляторами? Если это так, это все еще так, когда я начинаю отх...
задан 24 окт. '08 в 14:25
2
ответов

Может ли ptrdiff_t представлять все вычитания указателей на элементы одного и того же объекта массива?

Для вычитания указателей i и j элементам одного и того же объекта массива примечание в [expr.add # 5] гласит: [Примечание. Если значение i-j не находится в диапазоне представляемых значений типа std​::​ptrdiff_t, поведение не определено. - конечна...
задан 20 марта '18 в 12:27
4
ответов

Должен ли это называться какой-то особый случай обрезки объектов?

Скажем, у меня есть класс Derived, который происходит из класса Base, тогда как sizeof(Derived) > sizeof(Base). Теперь, если вы выделяете массив Derived следующим образом: Base * myArray = new Derived[42]; а затем пытается получить доступ к ...
задан 05 мая '16 в 15:54
1
ответ

Арифметика указателя по границам подобъектов

Имеет ли следующий код (который выполняет арифметику указателей на границах подобъектов) корректное поведение для типов T, для которых он компилируется (что в С++ 11, необязательно должен быть POD) или его подмножеством? #include <cassert> #i...
задан 05 марта '13 в 9:53
7
ответов

В чем обоснование ограничений на арифметику или сравнение указателя?

В C/С++ сложение или вычитание указателя определяется только в том случае, если результирующий указатель лежит внутри исходного указателя полный объект. Более того, сравнение двух указателей может быть выполнено только в том случае, если два заострен...
задан 03 дек. '17 в 11:05
1
ответ

Является ли указатель "один-на-конец" типа не-массива допустимым понятием в С++?

В стандарте С++ [с 5.7] говорится: Если оба операнда указателя и результат указывают на элементы одного и того же объекта массива или одно прошлое последний элемент объекта массива, оценка не должна приводить к переполнению; в противном случае пове...
задан 24 янв. '13 в 19:15
1
ответ

С++ интересный синтаксис для печати новой строки в std:: cout

следующий код печатает квадрат символов '*': int m = 5; int n=5; for (int i = 1; i <= n; i++) for (int j = 1; j <= m; j++) std::cout << "*" << " \n"[j==5]; Вывод: * * * * * * * * * * * * * * * * * * * * * * * * * ...
задан 14 мая '17 в 11:31
6
ответов

Принимает ли адрес локальной переменной постоянное выражение в С++ 11?

Следующая программа С++ 11: int x = 42; void f() { int y = 43; static_assert(&x < &y, "foo"); } int main() { f(); } Не компилируется с gcc 4.7, поскольку он жалуется: error: ‘&y’ is not a constant express...
задан 21 авг. '13 в 11:24
3
ответов

Почему добавление к указателю с + = работает, но указатель + 1 не работает?

Я выделяю память для массива, но я перемещаюсь туда, где указатель немного указывает вперед. Доступ к элементам работает нормально. Однако он начал создавать проблему с освобождением выделенной памяти. Malloc жалуется, что освобожденный указатель ник...
задан 31 янв. '15 в 23:45