[避免以后不小心犯错,再科普一次,警惕一下,呵呵^^]
(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="hello world";
s="hello world"; //错误:C2440: “=”: 无法从“const char [7]”转换为“char [30]”
printf ("%s\n",p);
printf("%s\n",s);
return;
}
但是对字符数组初始化时可以:
char s[]="hello world"; //正确
char *p=0;
p="hello world";
(4)输入方式
可将字符串直接输入字符数组,而不能将字符串直接输入指针变量。但可将指针变量所指字符串直接输出。
例如:scanf("%s",s); //正确
scanf("%s",p); //错误
例如下程序:
#include<stdio.h>
int main()
{
char *a;
//int i;
//for(i=0;i<3;i++)
scanf("%s",a);
printf("%s\n",a);
return 0;
在linux下能编译运行 但运行时提示Segmentation fault
原因是定义了一个字符指针,但指针没有确定地址,所以出现了段错误(即内存空间越界)。
printf("%s",p);//正确
(5)值的改变
在程序执行期间,字符数组名表示的起始地址是不能改变的,而指针变量的值是可以改变的。例如:
s=s+5; //错误
p=s+5;//正确