Set aside on the heap sizeof(Moose) * 5 bytes. We'll say this is an array of 5 elements of type Moose.
Store in pack the address of the first element of the array.
Without getting into too much detail about the low level operations, main() will put 5 and the address contained in pack somewhere where graze() will know where to find them, then will hand over control to graze().
In your particular program, you don't use any polymorphism, so the compiler will transform the definition of Animal::eat() to void Animal::eat(Animal *) and will transform this call to eat(p). After this, it's a normal function call with parameter passing.
More or less same as above, but with moo(p, "moo").
"moo" is a string literal. Using a string literal anywhere where it's allowed does two things:
* First, it instructs the compiler to set aside on the executable, space for the 4 byte array {'m', 'o', 'o', 0}.
* Second, it instructs it to replace the usage of the string with a pointer to the array.
All string literals are pointers, so you can do with them anything you can do with pointers, such as "moo"[1] == 'o'.
There are some details I glossed over because they would have lengthened this post several times without adding much that was relevant to your question, but I hope it was informative enough.