Enforcing "one-to-one-or-more" vs. "one-to-zero-or-more"
It seems to me that the second half of rule #2 is readily enforced with a foreign-key constraint, as you describe for rule #1.

But the first half of rule #2 seems hard to enforce, in part due to a chicken-vs-egg conflict:  Are you going to make 'em add a C before there's an A, so that when you add the A, it will have its (one) C? 

But you can't:  that new C needs a valid pointer to an A, which doesn't exist yet, and so can't be added.