转自:http://cjbskysea.blogbus.com/logs/33673946.html
(1)分配内存
假设有字符型指针变量与字符数组如下:
char *p ,s[10];
编译器为字符数组s分配10个字节内存,用于存放10个字符。而编译器只为指针变量p分配4个字节内存。
(2)初始化赋值含义
字符数组与字符指针的初始化赋值形式相同,但其含义不同。例如:
char s[ ] ="I am a student ! " ;
char *p="You are a student too ! " ;
对于字符数组是将字符串放到为数组分配的存储空间去,而对于字符指针是先将字符串存放到内存,然后将
存放字符串的内存起始地址送到指针p中。
(3)赋值方式
字符数组只能对其元素逐个赋值,而不能将字符串赋给字符数组名。对于字符指针变量,
字符串地址可直接赋给字符指针变量。例如:
s="I love China! "; //字符数组名s不能直接赋值,该语句是错误的。
p="I love China! "; //指针变量p可以直接赋字符串地址,语句正确
下面这个例子:编译报错:error C2440: “=”: 无法从“const char [7]”转换为“char [30]”
#include <string.h>
#include <iostream>
using namespace std;
void main()
{
char s[30];
char *p=0;
p="哈哈!";
s="哈哈!"; //错误:C2440: “=”: 无法从“const char [7]”转换为“char [30]”
cout<<"p="<<p<<endl;
cout<<"s="<<s<<endl;
return;
}
但是对字符数组初始化时可以:
char s[]="哈哈!"; //正确
char *p=0;
p="哈哈!";
cout<<"p="<<p<<endl;
cout<<"s="<<s<<endl;
(4)输入方式
可将字符串直接输入字符数组,而不能将字符串直接输入指针变量。但可将指针变量所指字符串直接输出。
例如:cin >> s //正确
cin >> p //错误
cout<<p //正确
(5)值的改变
在程序执行期间,字符数组名表示的起始地址是不能改变的,而指针变量的值是可以改变的。例如:
s=s+5; //错误
p=s+5; //正确