You have defined an array with the name p , and you cannot change the identifier, which is the name of the array. The name of the array always remains the name of the array - it is not a pointer ...
Could you write
char **p;
and it would compile. But it would not work. Neither would your code work, even if the name of the array was considered lvalue - because you declare an array with an unknown number of elements.
You can fix the situation:
char *p[] = {"12345","qwerty","l1l3433"}; int main(){ int i; char**pp = p; for(i = 0; i < 2; i++){ printf("%s\n", *++pp); } return 0; }
But here is the question: you first increase the pointer, and only then dereference ... You are right asking to withdraw only 2 elements, so do not go beyond the boundaries, but you want to bring out the second and third lines? If yes, then that's right, but if the first and second are, then ++pp should be replaced by pp++ .