Indeed, a delegate is much like a function pointer. The first difference is that a delegate is composed by 2 "pointers": a function pointer and an instance pointer. Not surprisingly, the Delegate class has these two properties:
// Gets the method represented by the delegate.
public MethodInfo Method { get; }
// Gets the class instance on which the current delegate
// invokes the instance method.
public object Target { get; }
The second difference is that .NET delegates can be multicast. It's possible to add two delegates in a single MulticastDelegate. It's also possible to remove a delegate from a multicast delegate. When invoked, a multicast delegate will invoke all its child delegates. This may drive other questions, but I would be deviating from the original question.
An event, on the other hand, is a completely different stuff. In fact, an event is a property with special accessors. Regular properties have these two accessors: get and set. Events have these two instead: add and remove.
The add accessor will combine the current delegate that is in the event with the new delegate into a multicast delegate. The remove accessor will do the opposite.
Having that in mind, it's easy to understand why C# designers picked out the += and -= operators. What I mean is that the following two lines are somewhat equivalent (if you ignore that fact that the second).
myButton.OnClick += newEventHandler;
myButton.OnClick = myButton.OnClick + newEventHandler;