Для правильного вопроса надо знать половину ответа
Вы заполняете только p[0] и p[1], остальные ячейки массива остаются неинициализированными.
Судя по всему, вы криво набрали текст с какого-то видеоурока, и, вместо *(p + i) написали *(p + 1).
Для правильного вопроса надо знать половину ответа
Элементарно. Классический массив - это выделенный непрерывный участок памяти с фиксированным размером, в который записаны элементы массива со смещением, соответствующим индексу элемента.
Доступ к элементу - это просто вычисление адреса элемента как (адрес начала массива + индекс элемента * размер элемента) и чтение/запись памяти по этому адресу.
Для правильного вопроса надо знать половину ответа
Представление любого числа в компьютере состоит из конечного числа битов. Умножая число на 2, вы просто сдвигаете его на один бит влево, заполняя младший (правый) бит нулём. А поскольку вы вычитаете единицу, если она образовалась, то с каждой итерацией в вашем числе всё меньше значащих битов.
Для правильного вопроса надо знать половину ответа
Потому что автор сей поделки не в состоянии даже грамотно назвать переменные. А о декомпозиции и не слышал.
Тут переписывать надо минимум половину кода. Условия составлены неверно, в конце цикла путаница с присвоением переменных.
А по уму надо написать функцию, которая будет проверять одно число и возвращать true/false - подходит число под условие или нет. Потом просто в цикле эту функцию вызывать и считать количество подходящих чисел.