在如上程式中 , 双引号做了3件事:申请了空间(在常量区) , 存放了字元串 ;在字元串尾加上了’/0’ ;返回地址 。这里就是把返回的地址赋值给了p 。但是char *p = “hello”;表达式为什幺可以 , 而把p换成数组 , 然后再赋值就不行了 。这是因为字元串常量”hello”出现在一个表达式中时 , ”hello”表达式使用的值就是这些字元所存储的地址(在常量区) , 而不是这些字元本身 。所以 , 可以把字元串赋值给指向字元的指针p , 而不能把字元串赋值给一个字元数组 。char a[10] = “hello”; 这样也是可以的 , 这种情况是c语言初始化所支持的 。如果写成char a[10]然后 a = “hello” 这样就错误了 。同样是a数组 , char a[10] = “hello”;这种是数组的初始化 , 和a[0] = ‘h’ a[1] = ‘e’…是一个道理 。但是换成char a [10] , 然后a = “hello”就不行了 “hello”赋值的值是一个地址 , 而a虽然也有地址 , 但是这与指针是不一样的 , 指针的值是地址 , 而数组的值虽然也是地址 , 但是却是一个常量 , 所以不能给常量赋值 。我们来测试一下:#include <stdio.h> int main(){ char *p = "hello"; printf("%s",p); char a[10]; a = "hello"; return 0;}error C2440: '=' : cannot convert from 'char [6]' to 'char [10]' There is no context in which this conversion is possible看到这样的错误提示 , 试一下把char a[10]改成char a[6]【字元串赋值】error C2106: ‘=’ : left operand must be l-value运算符的左边应该是一个“左值” 。所谓“左值”就是指在程式中占用记忆体空间、可以被修改的量,比如各种变数 。在使用指针的时候 , 指针可以自增 , 而数组名不能自增编译器给数组分配了空间 , 数组a的地址就表示一个常量了 , 让常量自增这肯定是不行的 。同时 , 在指针自增的时候 , 编译器会自动识别类型 , 比如指针是指向int型的 , 想获取下一个的地址时 , 指针直接p++就行了 , 不要多此一举的p+4了 。需要注意的是 , 在void指针使用的时候 , 不能使用指针运算 , 因为void型编译器不能识别类型的长度(即指针所指对象的体积) , p++这样就是不合法的 , 即不能进行数学运算 , 也不能使用*取值操作 , 想使用必须转换为其它的类型 。