説明が必要です。答えを探しましたが、見つかりませんでした。
問題は次のとおりです。私は本からの演習に取り組んでいます:「エンジニアのためのプログラミング」AR Bradley Chapter 7 コードの一部は次のとおりです。
struct _fifo {
unsigned capacity;
unsigned head;
unsigned tail;
void * data[0];
};
fifo newFifo(int capacity) {
// The capacity of a circular buffer is one less than one
// would think: if the user wants a given capacity, the
// required array is one cell larger.
capacity++;
fifo q = (fifo) malloc(sizeof(struct _fifo) + capacity * (sizeof(void *)));
q->capacity = (unsigned) capacity;
q->head = 0;
q->tail = 0;
return q;
}
int putFifo(fifo q, void * e) {
if ((q->head+1) % q->capacity == q->tail) // full?
return -1;
q->data[q->head] = e;
q->head = (q->head+1) % q->capacity;
return 0;
}
typedef void (*printFn) (void*);
int printFifo(fifo q, printFn f) {
unsigned i;
for (i = q->tail; i != q->head; i = (i+1) % q->capacity) {
f(q->data[i]);
}
return 0;
}
static void printLong(void * e) {
// %ld tells printf to print a long integer
printf("%ld", (long) e);
}
int main() {
fifo longq;
longq = newFifo(3);
printFifo(longq, printLong);
return 0;
}
私の質問は次のとおりです。関数 printLong で void ポインター e を渡しているので、キャスト (long) e は e のアドレスを作成しますか? 印刷されたアドレスではなく、データの値を取得しているのはなぜですか?
たとえば、これを行うと、値ではなくアドレスが出力されます。
typedef void (*printFn) (void*);
static void printLong (void * e) {
printf("%ld", (long) e);
}
int printL (void* l, printFn f) {
f(l);
}
int main()
{
long a = 5;
long* l = &a;
printf("%ld\n", *l);
printL(l, printLong);
return 0;
}
しかし、私がキャストした場合
*(long*) e
値を取得します。最初のコード部分がアドレスではなく値を出力するのはなぜですか? 何も見えないので、混乱していると思います。助けてください :)