РЕДАКТИРОВАТЬ: исходный выбор слова сбивал с толку. Термин «символический» намного лучше оригинального («мистического»).
При обсуждении моего предыдущего вопроса о C ++ мне сказали, что указатели
- "простой тип значения, очень похожий на целое число "
- не "мистический"
- "Битовый шаблон (представление объекта) содержит value (представление значения) (§3.9 / 4) для тривиально копируемых типов, которыми является указатель. "
Звучит неверно! Если ничто не является символическим и указатель является его представлением, я могу сделать следующее. Могу я?
#include <stdio.h>
#include <string.h>
int main() {
int a[1] = { 0 }, *pa1 = &a[0] + 1, b = 1, *pb = &b;
if (memcmp (&pa1, &pb, sizeof pa1) == 0) {
printf ("pa1 == pb\n");
*pa1 = 2;
}
else {
printf ("pa1 != pb\n");
pa1 = &a[0]; // ensure well defined behaviour in printf
}
printf ("b = %d *pa1 = %d\n", b, *pa1);
return 0;
}
Это вопрос C и C ++.
Тестирование с помощью Compile and Execute C Online с GNU GCC v4.8.3: gcc -O2 -Wall
дает
pa1 == pb
b = 1 *pa1 = 2
Тестирование с помощью Compile and Execute C ++ Online с GNU GCC v4.8.3: g++ -O2 -Wall
pa1 == pb
b = 1 *pa1 = 2
Итак, модификация b
через (&a)[1]
не удалась с GCC на C и C ++.
Конечно, хотелось бы получить ответ на основе стандартных цитат.
РЕДАКТИРОВАТЬ: Чтобы ответить на критику UB на &a + 1
, теперь a
представляет собой массив из 1 элемента.
Связанный: Разыменование указатель вне границы, содержащий адрес объекта (массив массива)
Дополнительное примечание: термин «мистический» был впервые использован, я думаю, Тони Делроем здесь. Я был неправ, одолжив его.
a
на массив. - person curiousguy   schedule 17.08.2015&a + 1
не определено, и компилятор может предположить, что это не изменяетb
, а вместо этого вставляет значениеb
. - person molbdnilo   schedule 17.08.2015b
не является элементом массива, поэтому поведение не определено. - person TartanLlama   schedule 17.08.2015a
на массив из 1 int, указатель действителен. - person curiousguy   schedule 17.08.2015int
s,float
s и все остальное. Использование значения неинициализированного объектаint
также не определено, независимо от хранимого им битового шаблона. - person molbdnilo   schedule 17.08.2015