Арифметика указателя увеличивает указатель на количество байтов, на которое указывает.Например,
int a[2];
int *p = a;
assert( &a[0] == p )
assert( &a[1] == p + 1 )
Следовательно, ваша строка
address = address + sizeof(int);
фактически изменит address
на address + sizeof(int) * sizeof(astruct)
(используя обычную арифметику без указателей).
Тамне гарантированный способ сделать то, что вы пытаетесь, потому что компилятору разрешено вводить заполнение в структуре.Рассмотрим структуру
struct A {
char a;
int b;
};
Компилятор, скорее всего, даст этой структуре следующий макет:
+------------+-------------------+-------------+
| a (1 byte) | (3 bytes padding) | b (4 bytes) |
+------------+-------------------+-------------+
Таким образом, вы не можете добраться до b
, взяв адрес экземпляра структуры идобавление 1.
В вашем конкретном случае компилятор , вероятно, не вводит заполнение, поэтому вы можете использовать эти строки для обновления address
:
address = (char *) address + sizeof(int); // OR...
address = (int *) address + 1;
Опять же, это полностью зависит от того, как компилятор выложит структуру так, как вы думаете, и любое небольшое изменение, вероятно, сломает ее, так что вы действительно не должны полагаться на этот типповедение.