Я не совсем понимаю, что означает int**
, это указатель указателя?
Да.
int
=целое число int *
= указатель на целое число int **
= указатель на (целое указатель) int ***
= указатель на- (pointer-to- (pointer-to-integer)) - (и т. д.)
Зачем вычитание таблицы указателей - int дастуказатель на указатель на int?
Поскольку в C (и C ++) массив при необходимости превращается в указатель на первый элемент. Например, int *t[10]
- это массив из 10 элементов указателя на int. t
может превратиться в указатель на t[0]
, то есть указатель на (pointer-to-int), int **
. Этот указатель затем может быть использован для арифметики указателя (например, вычитание).
Таким образом, вычитание n
из t
даст вам int **
, который указывает n
элементов "перед" началом вашего массива из 10 элементов (что, кстати, не будет безопасным указателем)использовать, если только n
не было нуля или небольшого отрицательного числа, поскольку оно указывало бы за допустимые границы памяти массива).
Когда мы ссылаемся на *t[0]
, мы ссылаемся наint* p
на сам указатель, потому что он является элементом таблицы или нам неявно нужен указатель для указания на слот, чем указатель на другое место?
Я неуверен, я понимаю этот вопрос. Поскольку t[10]
является массивом из 10 указателей (то есть 10 int *
), это означает, что t[0]
является единственным элементом в этом массиве и поэтому имеет тип int *
. Поэтому *t[0]
разыменовывает первый указатель в массиве, получая фактическое значение int
, на которое указывает указатель.