Следующее another question which caused much confusion, вот вопрос о семантике указателя, который, мы надеемся, прояснит ситуацию:Является ли memcpy указателя таким же, как присваивание?
Эта программа действительно во всех случаях? Единственная интересная часть - в ветке pa1 == pb.
#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) {
int *p;
printf ("pa1 == pb\n"); // interesting part
memcpy (&p, &pa1, sizeof p); // make a copy of the representation
memcpy (&pa1, &p, sizeof p); // pa1 is a copy of the bytes of pa1 now
// and the bytes of pa1 happens to be the bytes of pb
*pa1 = 2; // does pa1 legally point to b?
}
else {
printf ("pa1 != pb\n"); // failed experiment, nothing to see
pa1 = &a[0]; // ensure well defined behavior in printf
}
printf ("b = %d *pa1 = %d\n", b, *pa1);
return 0;
}
Я хотел бы получить ответ на основе стандартных котировок.
EDIT
По многочисленным просьбам, вот что я хочу знать:
- является указателем в семантическом «значение» (его поведение в соответствии со спецификацией) определяется только его числовым значением (численный адрес, который он содержит), для указателя данного типа?
- Если нет, , то можно скопировать только физический адрес, содержащийся в указателе, при этом оставляя связанную семантику?
Здесь, допустим, кто-то мимо конечного указателя случайно случайно указывает на другой объект; как я могу использовать такой один за конечным указателем для доступа к другому объекту?
Я имею право делать что-либо, кроме использования копии адреса другого объекта. (Это игра для понимания указателей в C.)
IOW, я стараюсь перерабатывать грязные деньги, как мафия. Но Я перерабатываю грязный указатель, извлекая его представление значения. Тогда это выглядит как чистые деньги, я имею в виду указатель. Никто не может сказать разницы, нет?
Да, это то же самое –
Что такое 'memcpy (& p, & pa1, sizeof p)' и 'memcpy (& pa1, & p, sizeof p)', который должен делать своими словами? Кроме того, вы действительно ** должны ** добавить некоторые строки о своих намерениях с помощью memcmp (см. Мой комментарий к Sourav Ghosh). – DevSolar
@DevSolar копирует физическое значение, точно так же, как присвоение 'int'; не передавать семантику – curiousguy