为什么把一个指针放在.h里面,多个cpp包含它就会重复定义,而数组就没有异常

为什么把一个指针放在.h里面,多个cpp包含它就会重复定义,而数组就没有错误?
例如,我有
$ cat a.h

#pragma once
const char* p="abc";

然后有两个cpp都去包含它,以及一个main.cpp

$ cat a.cpp
#include"a.h"
$ cat b.cpp
#include"a.h"
$ cat main.cpp
int main()
{
  return 0;
}

我联合编译:

$ g++ a.cpp b.cpp main.cpp
In file included from a.cpp:1:0:
a.h:2:9: warning: deprecated conversion from string constant to ‘char*’ [-Wwrite-strings]
 char* p="abc";
         ^
In file included from b.cpp:1:0:
a.h:2:9: warning: deprecated conversion from string constant to ‘char*’ [-Wwrite-strings]
 char* p="abc";
         ^
/tmp/cc5M1SOa.o:(.data+0x0): multiple definition of `p'
/tmp/ccWO86fC.o:(.data+0x0): first defined here

提示语法错误,指针变量p在a.cpp和b.cpp中重复定义。

但是如果我把a.h的内容改成下面这样:

#pragma once
const char p[]="abc";


编译就通过了。奇怪,为什么const char*编译不过,而const char[]能编译过呢?
区别到底在哪里? 能给个具体的解释么
------解决思路----------------------
引用:
我的问题是,声明成const []就可以,而const *就不行。
这里的区别在哪里?


const [] 是一个 const 类型(const array),但 const * 不是。

const T *  是一个指向 const T 的指针,指针本身并非 const ,因而不是一个 const 类型。如果需要指针是 const ,那么应该写成 T*const (指向 T 的 const 指针)或者 const T* const (指向 const T 的 const 指针)。

在名字空间中的 const 类型的变量默认是 internal linkage ,也就是其它文件中不可见。const [] 是 const 类型,两个文件中分别定义了两个,由于互不可见,于是相安无事。
但 const * 不是 const 类型,它有 external linkage,它可以被其它文件看到。于是在两个文件中分别定义,每个文件都看到这两个定义,于是会报告重复定义。