int *nums = {5, 2, 1, 4};
printf("%d\n", nums[0]);
causes a segfault, whereas
int nums[] = {5, 2, 1, 4};
printf("%d\n", nums[0]);
doesn't. Now:
int *nums = {5, 2, 1, 4};
printf("%d\n", nums);
prints 5.
Based on this, I have conjectured that the array initialization notation, {}, blindly loads this data into whatever variable is on the left. When it is int[], the array is filled up as desired. When it is int*, the pointer is filled up by 5, and the memory locations after where the pointer is stored are filled up by 2, 1, and 4. So nums[0] attempts to deref 5, causing a segfault.
If I'm wrong, please correct me. And if I'm correct, please elaborate, because I don't understand why array initializers work the way they do.