¿Qué diferencia hay entre la declaración de un puntero en C?
Creo que #1
uint8_t* start_ptr, end_ptr;
y #2
uint8_t* start_ptr;
uint8_t* end_ptr;
generalmente son iguales. Pero me parece que no lo son.
¿Podría alguien especificar qué hace el primero aparte del segundo?
Lo que sucedió:
if(strncmp(mseq,mseq_a,8) == 0){
start_ptr = MY_UART_RingBuffer_getReadPointer();
start_found = 1;
}
if(strncmp(mseq+3,mseq_z,5) == 0){
end_ptr = MY_UART_RingBuffer_getReadPointer();
if (start_found == 1){
if(!MY_UART_RingBuffer_getOverlap()){
end_ptr = end_ptr - 6;
}
else{
start_found = 0;
continue;
}
ptrdiff_t length = end_ptr - start_ptr;
start_found = 0;
}
}
Al usar #1, el compilador me dará esto para el cálculo de la longitud:
../Core/Src/main.c:143:32: error: invalid operands to binary - (have 'int' and 'uint8_t * {aka unsigned char *}')
ptrdiff_t length = end_ptr - start_ptr;
Al usar #2, todo funciona bien.
Estoy un poco confundido aquí. Veo la solución pero no entiendo realmente el problema.
Muchas gracias 😉
davy.ai
La diferencia entre #1 y #2 está en la declaración de las variables. En #1, solo la primera variable de puntero (start_ptr) se declara como un puntero, mientras que la segunda variable (end_ptr) simplemente se declara como un tipo uint8_t. Esto significa que al intentar realizar una aritmética de puntero, como en el cálculo de la longitud, el compilador ve a end_ptr como un entero y no como un puntero, lo que lleva al error de operandos inválidos.
En contraste, en #2 ambas variables se declaran como variables de puntero, lo que permite realizar correctamente la aritmética de puntero.
Por lo tanto, es importante declarar correctamente las variables como punteros al referirse a las direcciones de memoria y realizar aritmética de puntero.