На самом базовом уровне указатели позволяют вам связывать непересекающиеся блоки памяти. Простой (надуманный, по общему признанию) пример, в котором вам могут помочь указатели, - это алгоритм, для которого требуется массив из 1000000000000 целых чисел. Такой массив был бы слишком большим, чтобы поместиться в ОЗУ компьютера, на котором я сейчас печатаю, если бы я попробовал такое определение, как:
int bigMatrix[1000000000000]; // I can't allocate this much contiguous memory
Однако, если я создаю один массив указателей, я могу хранить вложенные массивы на дисковом массиве среднего размера.
int *bigMatrix[1000000]; // Each pointer refers to a sub-array
// of 1000000 elements on disk
По общему признанию, мне придется писать код на страницу в этих подмассивах, если / когда пользователь требует их, включая скрытие записи массива за методом доступа. Тем не менее, указатели позволяют мне создавать специальные ассоциации, которые мне нужны, когда они мне нужны.