2017-01-28 1 views
4

Я пытаюсь понять, почему код, следующий C++ не компилируетприращение указателя на массив

int main() { 
    int a[10]; 
    int (*p)[10] = &a; 
    int *q = static_cast<int *>(++p); 
} 

Если это не очевидно, что я пытаюсь сделать, это найти указатель на конец массива используя арифметику указателя.

Мое понимание до сих пор заключается в том, что p имеет указатель на массив из десяти целых чисел, а также выражение ++p. Обычно я могу назначить массив ints переменной типа указателя на int, но это не сработало указателем ++p.

Я сначала пробовал без static_cast, но это тоже не сработало.

+0

Вы можете сделать ' p' an 'int *': 'int * p = a; int * q = ++ p; ' –

+0

@GregKikola Да, я мог бы это сделать, но это не то, что я хочу сделать. Я думаю, что арифметика указателя должна быть разной в двух случаях. –

+2

О, я неверно истолковал, я не видел заметки о желании 'q' указывать на конец массива. В этом случае вы можете сделать 'int * q = a + 10;'. Альтернативно, с C++ 11, 'int * q = std :: end (a);' (просто включите ''). –

ответ

7

p имеет тип указатель на массив из десяти целых чисел

Это правильно.

Обычно я могу присвоить массив целых чисел в переменной типа указатель в целое

Это тоже правильно. Кроме того, если вы сравниваете свои два утверждения, вы должны увидеть очевидную разницу: p не является массивом ints, это указатель на массив ints. Следовательно, разница.

Теперь, если вы разыменования, что указатель на массив, результат будет выражением, тип которого является массивом (грубо говоря), и что может быть распались к указателю:

int *q = static_cast<int *>(*++p); 
+0

Спасибо, это имеет смысл. –

+0

Странно, что если я напечатаю 'p' и' q', я получаю то же самое. Таким образом, кажется, что что-то странное в отношении арифметики указателя на указатели на массивы. –

+0

@SidiousLord 'p' и' q' - разные типы, но они содержат один и тот же адрес, оба указывают на элемент сразу после конца массива. 'p' указывает на массив из 10' int ', начинающихся с этого адреса,' q' указывает на 'int' на том же адресе. –

Смежные вопросы