If I understood correctly, in this scenario you have My_Struct *abcd pointing to an address, and what you want is the address of a field inside this structure (it doesn't matter if this field is a pointer or not). The field is abcd->ptr, so its address you want is &abcd->ptr.
You can easily check this by printing the actual pointer values (the difference between the addresses should give you the offset of ptr inside My_Struct):
struct My_Struct {
int id;
void *ptr;
};
main()
{
struct My_Struct *abcd;
printf("%p %p\n", abcd, &abcd->ptr);
}
Update: If you want your code to be portable, standards-compliant, and past and future proof, you may want to add casts to void * to the printf() arguments, as per @alk's comments below. For correctness, you can also use a standard entry point prototype (int main(void) or int main(int argc, char **argv)) and, of course, include stdio.h to use printf().