Зачем вы добавляете к адресу?

Я в курсе структур данных, наш среднесрочный период подходит, и наш среднесрочный курс спрашивает, является ли каждая строка допустимым синтаксисом:

int num = 10;
int *p, *q;
p = #

q = p;  //valid
*p = q; //invalid, int* cannot be assigned to int
(*p)++; //valid
&num+1; //valid ********
p++;    //valid ********

Итак, последние две строки кода, насколько я понимаю, добавляют 1 к адресу переменной num.

Какую цель это будет иметь в кодировании?

0

Решение

В этом случае это приведет к неопределенному поведению. Это будет обращаться к int, который следует num в памяти, но нет определенного способа сказать, что это будет. Тем не менее, это правильный синтаксис.

Было бы гораздо разумнее, если бы ваш указатель указывал на элемент массива вместо скаляра. В этом случае обращение к следующему int разумно. Но в обоих случаях синтаксис действителен.

3

Другие решения

Целью, которую это будет иметь в кодировании, является написание таких тестов:

void f ( size_t length, int data[length] )
{
assert( 0 == length % 4 );
for ( int* p = data; p < data + length; p += 4 )
do_stuff_with_subarray( p, 4 );

return;
}

Условие цикла p < data + length bounds-проверяет указатель, сравнивая его с адресом, следующим за концом массива. Разыменование этого адреса было бы неопределенным поведением, но сравнение с ним — нет. (В этом упрощенном примере, тем не менее, будет UB, если do_stuff_with_subarray() когда-либо читает за конец массива, длина которого не делится на 4.)

0

По вопросам рекламы [email protected]