对于void*,并不是适合于任何场合的,不应一股脑儿都使用void*,特别对于楼主所举的例子,void*是不适合作为Item的替代物的,因为这里的Item都属于同一类型,没有必要再多一层间接性。如果所抽象的物件具有不同的类型,就可以考虑void*。
把typedef的用法称为“通用性”并不精确,所谓“通用性”其实不过是一件副产品。C的ADT目的是为了实现代码复用,体现的是原始的封装和接口与实现分离,各种“物件”是其操作对象,不同情况下物件的构成当然会有所不同,typedef的类型定义就是各种物件的不同抽象。