sizeof(name) возвращает размер всей строки в массиве
тут вы что-то путаете, должен возвращать размер указателя, т.е. 4 или 8 в зависимости от разрядности платформы.
У вас в примере вообще нет массивов, кроме как в инициализаторе. Массив это
char name[]={...}
в таком случае name является константой указывающей на массив, sizeof для нее — размер массива, константа не обладает собственным адресом, поэтому &name в данном случае возвращает адрес массива, т.е. собственно name. Во всем остальном она полностью эквивалентна const char *, по этой причине можно использовать *(name +i).
То, что при инициализации в скобочках можно не указывать размер — это особенность инициализации в C, при наличии инициализатора размер вычисляется при компиляции.
char* name={...} отличается от предыдущего примера тем, что name является не константой, а переменной, под которую выделяется дополнительная память (4/8 байт на 32/64-битных системах соответственно). Соответственно, sizeof(name) возвращает размер переменной, а &name вернет адрес этой переменной.