Учитывая, что только widgit *, а не widgit ** передается в dialKey, нет никакого способа сделать то, что вы хотите (значение widgit * не имеет отношения к структуре NUMBER_KEY). Предполагая, что вы действительно имеете в виду что-то вроде:
void dialKey(widget** ppWidget)
{
// Need to print 'num' of the struct that this widget resides in
}
У Microsoft есть изящный макрос для такого рода вещей (он помогает иметь возможность иметь процедуры, которые обычно управляют связанными списками в C):
#define CONTAINING_RECORD(address, type, field) ((type *)( \
(PCHAR)(address) - \
(ULONG_PTR)(&((type *)0)->field)))
Вы можете использовать это так:
NUMBER_KEY* pNumberKey = CONTAINING_RECORD( *ppWidgit, NUMBER_KEY, widgit);
printf( "%d", pNumberKey->num);