请教字符串指针和一维数组的区别在哪里

请问字符串指针和一维数组的区别在哪里?
char   *a= "abcdefg ";

char   a[]= "abcdefg ";

他们分别是怎样存储的?
编了一个程序,是更改abcdefghi的顺序的~~用上面的就出现错误~~下面就没问题~~
请高手赐教

------解决方案--------------------
char *a= "abcdefg ";
在 常量区有一个字符串 "abcdefg " ,
然后定义一个指针 a, 指针的内容为这个常量字符串的首地址。
注意,这里只是一个指针指向了 常量字符串,
所以你不能对字符串进行修改,
例如 a[i]= '? ' 这样的操作会出错,
但是你可以修改a:char b[10]= " "; a=b; //a指向数组b首地址, OK

char a[]= "abcdefg ";
定义了一个数组 a ,
把 字符串 "abcdefg " 【这个字符串本身在常量区】拷贝到数组中来。
这样,你可以修改 数组元素,a[i]= '? ' //OK
但是你不能修改数组名字地址: a=b //error !!
------解决方案--------------------
关键就是 指针指向的是一个常量,
它没有把常量的内容拷贝出来,
所以只能读,不能写

数组 则是把这个常量字符串复制了一份到自己的空间中,
所以可读可写,
实际上已经和原来的 常量字符串 没有关系了 ~
------解决方案--------------------
数组要么在静态存储区被创建(如全局数组),要么在栈上被创建。数组名对应着(而不是指向)一块内存,其地址与容量在生命期内保持不变,只有数组的内容可以改变。

  指针可以随时指向任意类型的内存块,它的特征是“可变”,所以我们常用指针来操作动态内存。指针远比数组灵活,但也更危险。
------解决方案--------------------
總的來說對於訪問內存來說 區別不大
但数组要么在静态存储区被创建(如全局数组),要么在栈上被创建。数组名对应着(而不是指向)一块内存,其地址与容量在生命期内保持不变,只有数组的内容可以改变。

  指针可以随时指向任意类型的内存块,它的特征是“可变”,所以我们常用指针来操作动态内存。指针远比数组灵活,但也更危险。

------解决方案--------------------
其实确切的还不够详细,在一个CPP文件中定义char a[] = "adsf ";然后在另一个CPP中声明extern char *a; 这样的话你们有试过吗,然后调用prinf 看看能否成功,或者反着看一下,定义成指针 声明成数组 其实指针跟数组的差别主要都是看编译器的,在存储上其实总的来说没很大区别,在 <C专家编程> 里讲得很详细