Это даст вам количество байтов, добавленных функцией apple_Build_BundleSeedIDPrefToken()
.(Общее количество байтов, которые были заполнены в массиве UART_BUF[]
, на единицу больше, так как этот оператор не будет считать байт при UART_BUF[0]
.)
В общем случае вычитание двух указателейтип T *
в массив элементов типа T
дает вам разницу как число элементов (а не количество байтов).(Результат не определен, если один из двух указателей не указывает ни на элемент в одном и том же массиве, ни на элемент сразу после последнего.) Сам результат имеет целочисленный тип со знаком ptrdiff_t
, который определен в<stddef.h>
.
Однако здесь оба указателя указывают на один и тот же массив unsigned char
, поэтому каждый элемент по определению является байтом.
Итак, выражение lcl_ptr - (unsigned char *)&UART1_BUF[1]
будетукажите количество байтов, добавленных функцией.(Обратите внимание, что &UART_BUF[1]
уже имеет тип unsigned char *
, поэтому приведение внутри выражения не нужно.)
Это выражение затем приводится к unsigned char
, что теоретически может усечь результат, хотя онов приведенном выше примере это явно не так.
Я отмечаю, что код немного странный, так как он присваивается UART_BUF[1]
три раза!
UART1_BUF[1] = 0x00;
устанавливает значение 0; lcl_ptr = apple_Build_BundleSeedIDPrefToken(&UART1_BUF[1]);
устанавливает значение 0x0D
внутри вызываемой функции; UART1_BUF[1] = (unsigned char)(lcl_ptr - (unsigned char *)&UART1_BUF[1]);
устанавливает значение 0x0E
, поскольку функция добавляет 14 байтов.
В общем, помните, что нужно быть осторожным с вычитаниями указателя: ожидать, что они всегда дадут количество байтов, является распространенной ошибкой ...
#include <stdio.h>
#include <stddef.h>
int main(void)
{
int array[4];
int *start, *end;
start = &array[1];
end = &array[3];
printf("Difference (as int *): %d\n", end - start);
printf("Difference (as char *): %d\n", (char *)end - (char *)start);
return 0;
}
дает (вклсистема, в которой sizeof(int)==4
):
Difference (as int *): 2
Difference (as char *): 8