You should use String s instead of arrays of characters wherever possible, as they cannot be overwritten by different values unintentionally. In addition, you may declare a member function as constant, indicating it cannot change any aspect of the object upon which it operates. Java supports the notion of constant, read-only values, using the final modifier. However, it does not support the notions of constraining writeable objects to be read only when passed as an argument, constraining return values to be read only, or constraining a method to not modify the object upon which it operates. In particular, there is no way of ensuring that a method that should not modify an object does not inadvertently do so.
Pointers are also one of the biggest sources of errors.
In addition, you must manipulate arrays using indices. These situations arise frequently in systems involving callbacks with known signatures to objects of a base type, where numerous different methods having the same signature may all be used for a particular callback and are dynamically assigned. There are ways around the problem, but they are not particularly intuitive or convenient. A parameterized type provides a means of writing one piece of code to describe an implementation for several similar types of arguments. It means more cutting and pasting to write each of the similar classes or methods by hand, but does not present a serious roadblock in terms of whether or not you can write an equivalent program.