0 and '\0' are the same, but instead of just saying that, how about we explain what these different ways of typing zero actually are.
In C there are many situations where the integer value 0 can be used. Obviously, it can be used as a plain integer or array index. But it can also be used to create a null pointer. And yet another use is null termination of strings.
Since null pointers and null termination of strings are wildly different things, there's a big risk of mixing up the terms. At some point back in the dark ages, a distinction was made by referring to null pointers as NULL and creating a macro named like that, expanding to a null pointer constant. And the character 0 ("the null character") in the symbol table was referred to as NUL with a single L. Still confusing.
Furthermore, C never defined an escape sequence for null termination, as was done for line feed \n, tab \n and so on. So there existed no way to type the null termination character when part of a string.
Then someone (Kernighan & Ritchie?) came up with the idea to use other already existing escape sequences in C for this purpose. Inside string or character literals, we may use escape sequences to type out the index of a symbol in the table. This can be done using either octal or hexadecimal notation.
For example, the line feed character with decimal value 10 can be typed inside a string out as \012 (octal) or \xA (hex). These are called octal/hexadecimal escape sequences. Example:
puts("test\ntest\012test\xAtest");
gives
test
test
test
test
Similarly, we can write the null character using escape sequences, either octal \0 or hex \x0. The octal version became convention and de facto standard for null termination.