C言語で文字列の配列(文字の配列ではない)をchar **に直接代入しようとするとコンパイル時に警告が表示されるのですが、
charポインタの配列を作り、そこに文字列の配列を代入した後で、charポインタをchar **に代入すると警告が表示されません。
この違いは何が原因なのでしょうか?

#include <stdio.h>

int main() {
    char *p_arr[] = {"XXXX", "DDDD"}; // ポインタの配列に文字列の配列を代入
    char **p2; // charポインタのポインタを宣言
    p2 = p_arr; 
    printf("%s\n", p2[0]); // 警告なし

    char **p3 = {"XXXX", "DDDD"}; //ポインタのポインタに文字列の配列を直接代入する (警告あり)
    printf("p3[0] = %s\n", p3[0]);

}

警告の内容:


p2.c:9:18: warning: incompatible pointer types initializing 'char **' with an expression of type 'char [5]' [-Wincompatible-pointer-types]
    char **p3 = {"XXXX", "DDDD"};
                 ^~~~~~
p2.c:9:26: warning: excess elements in scalar initializer
    char **p3 = {"XXXX", "DDDD"};
                         ^~~~~~