Обозначения массивов, используемые в выражениях с редкими исключениями, преобразуются в указатели на их первые элементы.
Из стандарта C (6.3.2.1 L-значения, массивы и указатели функций)
3 За исключением случаев, когда это операнд оператора sizeof или унарный оператор &, или строковый литерал, используемый для инициализации массива, выражение с типом '' массив типа '' преобразуется в выражение с типом '' указатель на тип '', который указывает на начальный элемент объекта массива и не является lvalue. Если объект массива имеет класс хранения регистров, поведение не определено.
Таким образом, в этом объявлении
uint8_t* pNextInputBytes = pInputByte;
массив, используемый в качестве инициализатора, преобразуется в указатель на свой первый элемент и имеет тип int *
. Это значение присваивается объявленному указателю.
В этом операторе
pNextInputBytes = &pInputByte;
применяется унарный оператор & для объекта типа массива. Таким образом, тип выражения &pInputByte
равен uinmt8_t ( * )[byteCount]
. Но в левой части задания есть объект типа uint8_t *
. Не существует неявного преобразования из одного типа в другой. Таким образом, компилятор выдаст ошибку.
Вместо этого вы можете написать
uint8_t pInputByte[byteCount];
uint8_t (*pNextInputBytes )[byteCount];
pNextInputBytes = &pInputByte;
Чтобы было более понятно, введите имя typedef для типа массива
typedef uint8_t T[byteCount];
Затем Вы можете объявить массив и указатель на массив следующим образом:
T pInputByte;
T *pNextInputBytes = &pInputByte;
Теперь, если подставить имя typedef T в объявлении указателя для определенного типа, вы получите
uint8_t ( *pNextInputBytes )[byteCount] = &pInputByte;
Чтобы увидеть разницу между двумя указателями, один из которых имеет тип uint8_t *
, а другой uint8_t ( * )[byteCount]
, напишите следующую демонстрационную программу.
#include <stdio.h>
#include <stdint.h>
int main(void)
{
size_t byteCount = 10;
uint8_t pInputByte[byteCount];
uint8_t *pNextInputBytes1 = pInputByte;
uint8_t ( *pNextInputBytes2 )[byteCount] = &pInputByte;
printf( "sizeof( *pNextInputBytes1 ) = %zu\n", sizeof( *pNextInputBytes1 ) );
printf( "sizeof( *pNextInputBytes2 ) = %zu\n", sizeof( *pNextInputBytes2 ) );
return 0;
}
Вывод программы:
sizeof( *pNextInputBytes1 ) = 1
sizeof( *pNextInputBytes2 ) = 10
Обратите внимание, что префикс p
, используемый в имени массива, может сбить читателей с кода.