Зачем нужны делегаты?
Делегаты можно считать более безопасной версией указателя на функцию. С жестко заданной сигнатурой функции, а значит и с проверкой типов. 
Предвосхищая следующий вопрос, события в c# сделали для защиты делегатов от несанкционированного вызова (это как геттер/сеттер только для делегата)
Ну во первых, в шарпе нет указателей. Во вторых фактически внутри это указатель, только как выше писали более безопасный.