Для начала, a
имеет тип char**
или «указатель на указатель на символ».В зависимости от вашего контекста это также может быть концептуально обработано как указатель на c-строку или массив c-строк.
a[1]
обрабатывает a
как массив и получает элемент в индексе 1(второй элемент, так как 0 - первый).Это значение типа char*
(указатель на символ или массив) располагается один после значения, на которое указывает a
.
&a[1]
дает ссылку на a[1]
.Это означает, что он дает вам значение указателя (в данном случае char**
), указывающее на память, содержащую a[1]
.
*ptr =
, разыменовывает местоположение ptr
и устанавливает его в значение справасторона выражения.Поскольку &a[1]
имеет тип char**
, то *ptr
имеет значение , вероятно также типа char**
, хотя это может и не быть (что может быть нежелательно).
Если *ptr
имеет тип char**
, тогда ptr
имеет тип char***
.Семантическое значение этого кода может различаться в зависимости от контекста и того, что вы пытаетесь достичь, но я думаю, что a
- это массив строк, а ptr
устанавливается для указания на второй элементмассив.Имейте в виду, что вторым элементом массива является указатель, и ptr
указывает не на то, на что указывает этот указатель, а на фактическое местоположение самого указателя.
Вот псевдокодированное объяснение со спискомстроки:
a = ["apple", "pear", "banana"]
После выполнения кода ...
ptr = ["pear", "banana"]
Где объекты, на которые указывает ptr
, они совпадают с a
,и вы просто просматриваете «подпредставление» списка a
.