The instruction pointer is a value usually stored in a dedicated register.
The register has to be set to the memory location of the first 'op code' of the code.
This varies by computer, but is usually at a fixed point, and the instruction register is initialized (usually) to that point (in memory).
As the program progresses, the instruction pointer is auto incremented by the length of the instruction being executed, or may be modified by the code itself (as in a branch instruction)
An Op code is the instruction 'command' if you will. It has a fixed value, for example in an unconditional branch instruction
will have a fixed value (set by the processor), say 0x65. This op code
may be (doesn't have to be) followed by any number of
arguments, which may include: memory address, length same as computer data buss for example 64 bits (8 bytes) and that followed by flags, port numbers, or any other needed arguments.