C中的字符串是比较有趣的,因为字符串的后面会有一个 "\0",比之前接触的Java中的字符串多了一个字符"\0",所以在再使用如下代码对字符串的长度进行打印的时候:

        char str[] = "hello";
    	int size = sizeof(str);
    	printf("%d\n", size);

    输出的长度是6,那是因为在字符串"hello"在内存中存储的时候多了一个字符'\0'。

    那么这个'\0'有什么作用呢?看下下面这几行代码:

        char b[]="world";
        char a[]={'h','e','l','l','o'};
        printf("%s\n",a);

    他们的输出结果是:helloworld

     但是假如将上面的字符串赋值为:

    char a[]={'h','e','l','l','o','\0'};

    那么输出的结果就是:hello

    可以看出字符'\0'是起到了字符串终结符,或者说正是因为字符数组含有字符'\0'才使字符数组变成字符串的吧,在对内存中对字符串进行定义的时候是要遇到字符'\0'的时候就会将其与之前的字符组成字符串。

     

    --------------------------------以上是关于'\0'在字符串中的作用的--------------------------------------

        char *p_str = "hello";
    	p_str[0] = 'H';
    	printf("%s\n", p_str);
    
    	char str[] = "hello";
    	str[0] = 'H';
    	printf("%s\n", str);

    看以上代码,其中指针变量p_str指向的是“hello”这个字符串的首地址,str代表符数组;

    在代码中str[0]可以改变字符串“hello”使其变成“Hello”,但是使用指针p_str[0]却不能改变字符串的值使其成为“Hello”。

    这是因为c语言中的内存是分为:

    1、常量区

          存放一些常量字符串

    2、堆

        存放对象

    3、栈

        存放局部变量

    内存模型和和Java中的略像。

     char[] star="hello";这种方式声明的一般被称为字符串变量

     char *str="hello";  这种方式声明的一般被称为字符串常量,是不能被修改的

    	char *s1 = "hello";
    	char *s2 = "hello";
    
    	printf("%p\n%p\n", s1,s2);


    上面的代码的输出结果是

    01116B30
    01116B30

    也就是说是s1和s2这两个指针变量指向的地址都是一样的,其实这点和Java中的String字符串是非常相似的,Java中的字符串也是不可变的,被放在字符串常量池中。不同的就是Java对字符串的处理会更加自动化一些,我们对Java中的字符串进行修改的时候是不会报错的,它会直接创建新的字符串,然后让引用指向新的字符串,但是在C语言中,这么做是会报错的。

    假如需要对字符串进行更改那么我们最好的方式就是用数组的方式声明字符串:

    char str[]="hello";

    如果我们不需要对字符串进行修改的话,并且经常使用,还是使用指针声明的方式比较好一些,毕竟省内存嘛。