When you get a screen asking you if you want to use the debugger, use it! If you built in debug mode, it'll show you precisely where the program broke and will show you the values it has for your variables at that point. It's good that you had an intuition about what sort of error you had here, but as your code grows, finding a bug in your whole program without having some detailed diagnostics is going to be almost impossible.
What you're looking for here is the 'address of' operator. Given a full object - e.g. an SDL_Rect - and a function that wants a pointer to such an object - e.g. SDL_RenderCopyEX - you need to take the address of that object, which is essentially what a pointer is.
https://www.tutorialspoint.com/cplusplus/cpp_pointer_operators.htm
With that in mind, use normal objects wherever possible and just pass pointers to them when SDL needs you to.
In some cases, SDL will give you pointers to objects, such as with IMG_LoadTexture; in those cases, just keep using it as a pointer, and remember to free it at the end using whatever the prescribed method is (SDL_DestroyTexture in this case, I think).
11 minutes ago, windghost91 said:In my experience, sometimes, the compiler is able to convert SDL_Rects to pointers
The compiler will never magically change a full object into a pointer. It can sometimes change an array of full objects into a pointer which happens to point to the first of those objects, but you shouldn't rely on this behaviour until you understand exactly what it's doing.