Массивы, используемые в выражении, неявно преобразуются (за редкими исключениями) в указатели на их первые элементы.
Так что, если массив объявлен так
char arr[4][10]
, то это объявление вы можете переписать как
char ( arr[4] )[10]
и в выражении указатель массива преобразуется в указатель на его первый элемент
char ( *p )[10]
Так что в этом выражении
(*arr)[3] - 1)
преобразовывается arr на тип char ( * )[10]
и указывает на первую строку, хранящуюся в массиве. Применяя оператор *
, вы получаете первый подмассив (первую строку), который имеет тип char[10]
.
. Применяя оператор индекса, вы получаете четвертый символ в строке, равный 's'
, Теперь вычитая 1, вы получите символ 'r'
.
Во втором выражении
*arr[2] + 3
, которое можно эквивалентно переписать, например
*( arr[2] ) + 3
, которое вы сначала получите третий подмассив массива, который является подмассивом со строкой "и" . This sub-array has the type
char [10] . Dereferencing the array designator (that is implicitly converted to pointer to its first element) you get the first character of the string that is
'a' Adding to the character 3 you get the character
'd'`.
Разница между Выражение состоит в том, что в первом случае вы разыменовываете указатель массива, получая указатель на первый элемент, а затем применяете оператор индекса для одномерного массива символов. Во втором случае вы сначала применяете оператор индекса снова, получая одномерный массив, а затем разыменовываете указатель массива, который неявно преобразуется в указатель на его элемент fir.
Вы должны понимать, что если у вас есть такой массив, как например,
char s[] = "Hello";
, тогда выражение *s
эквивалентно *( &s[0] )
, то есть s[0]
.