char *ar[3]= {"arrtest","ao", "123"};
$\rightarrow$ Here $ar$ is an array of character pointers.
$\rightarrow$ In this each character pointer i.e. ar[0] , ar[1] and ar[2] is pointing to the first char of the string constants "arrtest", "ao" and "123" respectively.
$\rightarrow$ When we execute the above line then first the string constants are created at a memory location and then the pointers start pointing to memory location of the first character of each of the string constants.
char* ar[4];
scanf("%s",ar[3]);
This will not work. why ?
$\rightarrow$ Because first you are creating an array of character pointers and since they are not initialized so they are pointing to nothing.(i.e. not pointing to any memory location)
$\rightarrow$ So when you write $ar[3]$ in $scanf$ , $a[3]$ will not provide any address location to $scanf$. ($\because$ a[3] is not pointing to any memory location.)
$\rightarrow$So if $scanf$ takes the input then where will it store the input ?
$\rightarrow$ In order to correct it you should first dynamically create a memory location and make the pointer point to that memory location.
$\rightarrow$ So that when you take the input using $scanf$ then the value will be stored at that memory location which you created at which the pointer is pointing.
char* ar[3];
ar[0] = (char*) malloc(20); //char* is doing typecasting.
ar[1] = (char*) malloc(20);
ar[2] = (char*) malloc(20);
scanf("%s",ar[0]);
scanf("%s",ar[1]);
scanf("%s",ar[2]);
printf("%s",ar[0]);
printf("%s",ar[1]);
printf("%s",ar[2]);