Fixing the opening example, CASE1 is incorrect syntax and CASE2 is correct.

Code:
//#define CASE1
#define CASE2

struct S
{
	int* P;
};

void main()
{
	struct S s;
	s.P = malloc(sizeof(int));
        *(s.P) = 1234; // Ok
        #ifdef CASE1
        s.P[0] = 1234; // Error: subscript requires array or pointer type
        #endif
        #ifdef CASE2
        (s.P)[0] = 1234; // Ok
        #endif
	int* p = s.P;
	p[0] = 2345; // Ok
	printf("%d", *(s.P));
	free(s.P);
}