To expand on what TheSpaceMan said, the PlayerController can possess any pawn and any pawn can be possessed by a controller.
Ideally, you’d want to have custom events on the pawn drive its actions and have your PlayerController accept input.
Player moves joystick -> PC listens for joystick motion then modulates it (multiply it by runSpeed, for example) -> PC fires custom event on pawn (e.g. a custom event called “MoveForward” with a float input “Amount”) -> pawn moves
This allows you to have an AI controller possess this pawn. It would also allow the player to possess different characters throughout the course of the game without having to rewrite the logic to accept input. It would already be on the PlayerController. You would just need to set up some new custom events on the other pawn.
Of course, this is all optional. If you never change characters or have your pawn controlled by AI, then you can just put all the logic on the pawn and it’ll all work. PCs just make it a bit easier to separate player from pawn if you need to.
I’d personally recommend using them this way in every game. You never know when development plans change and you want to add a side-story with another character.