1. #include <stdio.h>
    2. int main(){
    3. char str[] = "http://c.biancheng.net";
    4. char *pstr = str; //str代表数组首个元素的地址
    5. int len = strlen(str), i;
    6. //使用*(pstr+i)
    7. for(i=0; i<len; i++){
    8. printf("%c", *(pstr+i));
    9. }
    10. printf("\n");
    11. //使用pstr[i]
    12. for(i=0; i<len; i++){
    13. printf("%c", pstr[i]);
    14. }
    15. printf("\n");
    16. //使用*(str+i)
    17. for(i=0; i<len; i++){
    18. printf("%c", *(str+i));
    19. }
    20. printf("\n");
    21. return 0;
    22. }

    运行结果:

    http://c.biancheng.net

    http://c.biancheng.net

    http://c.biancheng.net

    除了字符数组,C语言还支持另外一种表示字符串的方法,就是直接使用一个指针指向字符串,例如:

    1. char *str = "http://c.biancheng.net";

    或者:

    1. char *str;
    2. str = "http://c.biancheng.net";

    字符串中的所有字符在内存中是连续排列的,str 指向的是字符串的第 0 个字符;我们通常将第 0 个字符的地址称为字符串的首地址。字符串中每个字符的类型都是char,所以 str 的类型也必须是char *。

    这一切看起来和字符数组是多么地相似,它们都可以使用%s输出整个字符串,都可以使用*或[ ]获取单个字符,这两种表示字符串的方式是不是就没有区别了呢?

    有!它们最根本的区别是在内存中的存储区域不一样,字符数组存储在全局数据区或栈区,第二种形式的字符串存储在常量区。全局数据区和栈区的字符串(也包括其他数据)有读取和写入的权限,而常量区的字符串(也包括其他数据)只有读取权限,没有写入权限。

    我们将第二种形式的字符串称为字符串常量,意思很明显,常量只能读取不能写入。请看下面的演示:

    1. #include <stdio.h>
    2. int main(){
    3. char *str = "Hello World!";
    4. str = "I love C!"; //正确
    5. str[3] = 'P'; //错误
    6. return 0;
    7. }