Vielleicht habe ich die Leute mit meinem Beispiel verwechselt. Ich habe versucht, einen Teil des Codes zu verstehen und vereinfacht. Hier ist ein Teil des ursprünglichen Codes (nochmal vereinfacht ... :)) (siehe Original Post unten).Warum den Zeiger werfen?
uint16_t hal_nrf_read_multibyte_reg(uint8_t *pbuf)
{
uint8_t memtype;
memtype = *(uint8_t*)(&pbuf);
if (memtype == 0x00U)
{
uint8_t data *buf = (uint8_t data *)pbuf;
DOTHIS
}
if (memtype == 0x01U)
{
uint8_t xdata *buf = (uint8_t data *)pbuf;
DOTHAT
}
if (memtype == 0xFEU)
{
uint8_t pdata *buf = (uint8_t data *)pbuf;
DOSOMETHING
}
return SOMETHING;
}
void main()
{
uint8_t payload[3];
hal_nrf_read_multibyte_reg(payload);
while(1) { }
}
Also habe ich mich gefragt, warum werfen sie pbuf, die bereits von uint8_t ist. Aber ich denke, ich habe jetzt meine Antwort.
------------ ALTE POST -------------
Ich erforsche Nordic Semiconductors nRF24LE1.
Wenn ich den folgenden Testcode habe.
void tempF(int *test)
{
int varA;
int varB;
int varC;
varA = *(int*)(&test); // The way it is done in the source code
varB = *(&test);
varC = test;
printf("A: %x\n", varA);
printf("B: %x\n", varB);
printf("C: %x\n", varC);
printf("C1: %x\n", test);
if (test == 0x00)
printf("equals 0x00");
}
int main(void) {
int myArray[3];
tempF(myArray);
return 0;
}
Die printfs geben alle die gleiche Antwort. Was ist der Grund dafür, es "varA-style" zu machen? Beispiele wo es notwendig ist?
Wenn ich den Weg in varA ich nicht bekommen, die Warnung „C260 Warnung:‚=‘: Zeiger Abschneiden
Sind Sie sicher, Typ von 'var?' Ist nicht 'int *'? –
Keiner Ihrer 3 Fälle ergibt einen Sinn. Wenn Sie die Adresse drucken möchten, ist es besser und sicherer, dies einfach mit dem% p-Spezifizierer zu tun, ohne dass dazwischen Konvertierungen vorgenommen werden müssen. – Lundin
Verwenden Sie kein int, um einen Zeiger zu speichern, wenn Sie einen Zeiger als Ganzzahl speichern möchten, us (u) intptr_t – 12431234123412341234123