table = fizz(table);
Что сделать-то хотел?
Если проинициализировать массив значением которое вернула fizz, нужно было просто проинициализировать его в этой функции.
Если поменять область памяти на которую указывает table, то нужно было сделать table указателем.
Почему при передаче table в fizz struct Item[100] преобразуется в struct Item *table, а при присваивании - нет?
Потому что массив -- это синтаксис для статического выделения памяти на стеке, в области данных или в структурах. Имя массива -- это имя этого блока памяти, а его адрес -- адрес этого блока. Поэтому имя массива можно легко сконвертировать в адрес. Но если бы язык давал возможность менять адрес массива с помощью присваивания его имени, массив помимо своих элементов должен бы был содержать дополнительный указатель. Получился бы странный, сложный класс объектов, соединяющий в себе свойства массива и указателя. Поскольку язык С -- простой язык, у вас есть отдельно массивы и отдельно указатели, а сложный тип можно сделать самому.