Из всего написанного по сути сказано только:
Указатель — это переменная, хранящая в себе адрес ячейки оперативной памяти
остальное - какой-то шлак.
Добавлю от себя про указатели:
Память в компьютере адресуется побайтово.
Биты внутри байта адресовать через указатель нельзя.
Адрес - это просто беззнаковое целое число - номер байта в памяти.
В 32битных процах максимально доступно 2^32 байта памяти, в 64битных - 2^64.
Соответственно для хранения адреса в 32битных системах нужно 32 бита, т.е. 4 байта, в 64битных - 64 бита, т.е. 8 байт. Таким образом, в зависимости от разрядности процессора меняется размер указателя.
Когда некий объект (строка, число, и прочее) сохранен в памяти он не имеет типа - это просто набор байт некоторой длины. Типизацией занимается программа. Например в процессоре существуют наборы арифметических команд для целых 1 байтовых переменных, 2 байтовых, 4 и 8 байтовых (отдельно для знаковых и беззнаковых). Т.е. это реально разные ассемблерные инструкции (например для сложения). Таким образом задавая тип указателя, вы говорите компилятору, что к памяти, адресуемой этим указателем, нужно применять инструкции для этого типа данных.
Для типизированных указателей можно использовать адресную арифметику, потому что компилятору известен размер типа. Для не типизированных указателей (void*) адресная арифметика не возможна.