使用字符串指针变量与字符数组的区别
(1)分配内存
设有定义字符型指针变量与字符数组的语句如下:
char *pc ,str[100];
则系统将为字符数组str分配100个字节的内存单元,用于存放100个字符。而系统只为指针变量pc分配4个存储单元,用于存放一个内存单元的地址。
(2)初始化赋值含义
字符数组与字符指针变量的初始化赋值形式相同,但其含义不同。例如:
char str[ ] ="I am a student ! " ,s[200];
char *pc="You are a student ! " ;
对于字符数组,是将字符串放到为数组分配的存储空间去,而对于字符型指针变量,是先将字符串存放到内存,然后将存放字符串的内存起始地址送到指针变量pc中。
(3)赋值方式
字符数组只能对其元素逐个赋值,而不能将字符串赋给字符数组名。对于字符指针变量,字符串地址可直接赋给字符指针变量。例如:
str="I love China! "; //字符数组名str不能直接赋值,该语句是错误的。
pc="I love China! "; //指针变量pc可以直接赋字符串地址,语句正确
(4)输入方式
可以将字符串直接输入字符数组,而不能将字符串直接输入指针变量。但可将指针变量所指字符串直接输出。
例如: cin >> str //正确
(5)值的改变
在程序执行期间,字符数组名表示的起始地址是不能改变的,而指针变量的值是可以改变的。
小结 字符数组s[100] 指针变量pc
(1)分配内存 分配100个单元 分配4个单元。
(2)赋值含义 字符串放到数组存储空间 先将字符串存放到内存
将存放串的首地址送到pc中。
(3)赋值方式 只能逐个元素赋值 串地址可赋给pc
(4)输入方式: 串直接输入字符数组 不能将字符串直接输入指针变量
(5)值的改变: 字符数组首地址不能改变 指针变量的值可以改变
1.
2.
char *ps="C Language";
可以写为:
ps="C Language";
而对数组方式:
不能写为:
而只能对字符数组的各元素逐个赋值。
当一个指针变量在未取得确定地址前使用是危险的,容易引起错误。
一个错误的例子,如下:
但是对指针变量直接赋值是可以的。因为C系统对指针变量赋值时要给以确定的地址。
3.字符串常量内容不可通过指针修改:
int main()
{
char str1[40]="hello world!"; //char *str1="hello world!";
str1[4]='A'; //若str1是指针型的,编译通过,但运行是此处会段错误
printf("%sn",str1);
return 0;
}
关于“
str1是指针型时,“hello
什么是字符串常量呢?就是我们不能更改起内容的字符串。所以str1[4]='A';这样赋值就会出错。
至于为什么是运行出错而不是编译出错,我想这是编译器的问题。我用的是gcc编译器,他可能并不知道str1指向的是一个字符串常量,我们当然可以设计自己的编译器让它识别这样的错误使程序在编译时就报错。