字符数组归根结底还是一个数组,上节讲到的关于指针和数组的规则同样也适用于字符数组。更改上面的代码,使用指针的方式来输出字符串:
1 #include <stdio.h> 2 #include <string.h> 3 int main(){ 4 char str[] = "http://c.biancheng.net"; 5 char *pstr = str; 6 int len = strlen(str), i; 7 //使用*(pstr+i) 8 for(i=0; i<len; i++){ 9 printf("%c", *(pstr+i)); 10 } 11 printf("\n"); 12 //使用pstr[i] 13 for(i=0; i<len; i++){ 14 printf("%c", pstr[i]); 15 } 16 printf("\n"); 17 //使用*(str+i) 18 for(i=0; i<len; i++){ 19 printf("%c", *(str+i)); 20 } 21 printf("\n"); 22 return 0; 23 }
运行结果:
http://c.biancheng.net
http://c.biancheng.net
http://c.biancheng.net
除了字符数组,C语言还支持另外一种表示字符串的方法,就是直接使用一个指针指向字符串,例如:
或者:
字符串中的所有字符在内存中是连续排列的,str 指向的是字符串的第 0 个字符;我们通常将第 0 个字符的地址称为字符串的首地址。字符串中每个字符的类型都是char
,所以 str 的类型也必须是char *
。
下面的例子演示了如何输出这种字符串:
1 #include <stdio.h> 2 #include <string.h> 3 int main(){ 4 char *str = "http://c.biancheng.net"; 5 int len = strlen(str), i; 6 //直接输出字符串 7 printf("%s\n", str); 8 //使用*(str+i) 9 for(i=0; i<len; i++){ 10 printf("%c", *(str+i)); 11 } 12 printf("\n"); 13 //使用str[i] 14 for(i=0; i<len; i++){ 15 printf("%c", str[i]); 16 } 17 printf("\n"); 18 return 0; 19 }
运行结果:
http://c.biancheng.net
http://c.biancheng.net
http://c.biancheng.net
这一切看起来和字符数组是多么地相似,它们都可以使用%s
输出整个字符串,都可以使用*
或[ ]
获取单个字符,这两种表示字符串的方式是不是就没有区别了呢?
有!它们最根本的区别是在内存中的存储区域不一样,字符数组存储在全局数据区或栈区,第二种形式的字符串存储在常量区。全局数据区和栈区的字符串(也包括其他数据)有读取和写入的权限,而常量区的字符串(也包括其他数据)只有读取权限,没有写入权限。