*pSpiTxBuf++ = CC2520_INS_SFLUSHRX; // get rid of this packet
*pSpiTxBuf-- = CC2520_INS_SFLUSHRX; // double flush [CC2520 Bug#1]
上記の2行が何をしようとしているのか、誰か説明してもらえますか? pSpiTxBuf
ですuint8_t *
これは次と同等です。
pSpiTxBuf[0] = CC2520_INS_SFLUSHRX; // get rid of this packet
pSpiTxBuf[1] = CC2520_INS_SFLUSHRX; // double flush [CC2520 Bug#1]
(これはおそらく、そもそもコードを書くためのより明確な方法だったでしょう)。
つまり、2つの隣接するレジスタ値をCC2520_INS_SFLUSHRXに設定するだけです。
インクリメント演算子とデクリメント演算子は、逆参照の前にポインターのアドレスを変更します。したがって、バッファを進めて、新しくポイントされたセルの値を変更します。
わかりやすくするためにいくつかの括弧を入れます:
*(pSpiTxBuf++) = CC2520_INS_SFLUSHRX;
を無視する++
と、それは標準的なポインターの参照とフォームの代入です*p = q
。ただし、p
たまたまポストインクリメント演算子が含まれています。つまり、通常どおり値を使用しますが、使用した後はインクリメントします。
CC2520_INS_SFLUSHRX
最初のものは、値を*pSpiTxBuf
、つまり が指す位置に代入していますpSpiTxBuf
。pSpiTxBuf
その後、次の位置を指すようにインクリメントされます。
2 番目のものは似ていますが、後でポインターをデクリメントするため、前の位置を指すようになります。