我们先来直观地感受下字符串数组与字符串指针变量:
char s1[] = "helloworld";
char *s2 = "helloworld";
(第一行是字符串数组,第二行是字符串指针变量)
区别1:
字符串指针变量本身是一个变量,用于存放字符串的首地址。而字符串本身是存放在以该首地址为首的一块连续的内存空间中并以‘\0’作为串的结束。
字符数组是由于若干个数组元素组成的,它可用来存放整个字符串。
区别2:
对字符串指针方式 char *ps="C Language"; 定义时可以写为:
char *ps; ps="C Language";
而对数组方式: static char st[]={"C Language"}; 只能对字符数组的各元素逐个赋值,不能写为:
char st[20]; st={"C Language"};
这是因为,字符串指针变量只是一个指向字符串首地址的指针变量,我们可以对指针变量进行赋值,确定其指向的地址空间;而字符串数组在定义时便在内存中为其分配了空间,也就是说,我们不能随意的改变这个数组的地址。
区别3:
我们通过一个小程序来认识这个区别。
这段程序运行的结果是:#include <stdio.h> #include <string.h> int main() { char c1[] ="helloworld"; char *c2 = "helloworld"; printf("sizeof(s1) : %d %d\n", sizeof(c1), sizeof(c2)); printf("strlen(s2) : %d %d\n", strlen(c1), strlen(c2)); return 0; }
"helloword"一共10个字符,所以strlen的值都为10;
差别体现在sizeof的值。用字符串数组定义的"helloword"占11个字节,是因为"helloword"加上结尾的"\0"一共十一个char型字符,每个char型字符占1个字节;
而用字符串指针变量定义时,sizeof的值仅为4个字节,这是因为s2是一个指针,在32位系统中,地址占4个字节。