字符数组与字符指针的区别以及字符串常量的修改

来源:互联网 发布:网络流行文体 编辑:程序博客网 时间:2024/06/02 10:00
 字符数组 char  string[20]=“hello zhao!”      字符指针  char  *str="hello zhao!"  (把字符串常量的首地址赋给了这个字符指针str)

 区别 : 字符数组是在内存中开了一段空间用来存放  "hello zhao!”如下所示: 

hello zhao!\0         string是数组名,其实一个常量(或标号),其不占用内存空间,所以只开了一段空间,就是这个字符串占得空间。string其值就是这个字符数组的第一个元素的地址。相当于一个标号,它不能被赋值,也不能参与自增自减运算

         而字符指针是个变量,其可以被赋值,  char  *str="hello zhao!"  在内存中定义是开了两段空间的,一是因为string是个变量,所以其本身也占用一个字节的内存,而这一个字节中存放的是字符串常量"hello zhao!"的地址;二是另一段是字符串常量"hello zhao!"所占了一段空间。如下所示string这个变量其值位字符常量首地址............hello zhao!\0

注意:a、string="hello zhao!";是不行的,string数组名不能被赋值。

            b、char  *str="hello zhao!"  这种字符指针指向的是字符常量,"hello zhao!"是 字符常量,是不可改变的,所以不能通过字符指针修改这个字符串的内容。

            c、char *a, str[10];   a = str;  这样子 当字符指针指向一个字符数组的时候,可以通过字符指针修改str[10]中的变量

            d、字符数组在定义和编译时系统会自动分配内存单元,而字符指针变量定义后最好将其初始化,否则字符指针变量的值会指向一个不确定的内存段,将会破坏程序。
            如:char *a;
                    scanf( "%s", a );这种方法是很危险的,应该这样:
                    char *a, str[10];
                    a = str;
                    scanf( "%s", a );这样字符指针就指向了一个确定的内存段

             e、字符指针的两种初始化方法如上蓝色标出了。