字符串数组与字符串指针

  这本来是前天写的内容,一直拖到了现在,本来打算今天晚上写,又怕拖到明天,现在写了吧。该死的拖延症。

  在编程的时候这块遇到好几次问题。而且越看越糊涂,上网查了查,自己写一写,看看对不对。有雷同,有改进。

字符串数组与字符串指针的区别

  C中没有字符串数据类型,一般使用数组对字符串进行各种操作。

(1)字符串指针

  字符串指针是定义了一个指针变量,指针变量存储的是某个字符串的内存首地址。他是指针变量被放在内存中的栈区。在编译器编译时,会自动在字符串结尾处添加结束标识符''。

(2)字符串数组

  字符串数组是用数组来存储字符串。字符串数组作为变量存储在内存中的栈区。C对于字符数组没有硬性规定一定要在末尾处添加结束符,即可有可无。但好多字符串函数都是以结束符作为判断的标志,所以要注意在使用字符数组时记得在末尾处添加结束符。

(3)关于字符串指针和字符串数组初始化的问题

  首先解释字符串常量。字符串常量是这静态存储区中的一段连续的内存,以''结束。只读,不可修改。

  a.字符串指针初始化

  可使用字符串常量对指针初始化,如下所示:

    char *p = "hello world";

    或

    char *p; 

    p = "hello world";

  使用字符串常量对指针初始化时,指针是变量存储在内存中的栈区,字符串常量存储在静态存储区,不可修改,如果修改会出现未定义错误。例子:

    char *p = "hello world";

    *(p + 1) = 'E';               //这样的赋值是错误的,不能更改字符串常量

  b.字符数组初始化

  可使用字符串常量对数组初始化,如下所示:

    char str[] = {"hello world"};

  也可以对数组单个元素初始化,如下所示:

    char str[] = {'h', 'e', 'l', 'l', 'o', ' ', 'w', 'o', 'r', 'l', 'd'};

  使用字符串常量对数组初始化时,数组作为变量存储在内存中的栈区,字符串作为元素值被放在数组所分配的内存空间中。且可对数组元素进行修改。

    char str[] = {"hello world"};

    str[0] = ’H';             //这样的操作是正确的

  (4)字符串数组中的结束符问题

  C对于字符数组没有硬性规定一定要在末尾处添加结束符。

  a.当表明数组大小时,

    char str[4] = {"Good"};

  b.当未表明数组大小时,

    char str[] = {"Good"};

    即 char str[0] = {'G'}; char str[1] = {'o'}; char str[2] = {'o'}; char str[3] = {'d'}; char str[4] = {''};

  上述是表明数组大小与未表明数组大小编译器的方式

  (5)使用指针时要防止出现段错误,防止指针指向内存中不明空间。

  当一个指针变量在未取得确定地址前使用是危险的,容易引起错误。
  一个错误的例子,如下:       
           char *name;
           scanf("%s",name);
           printf("%s",name);
  有的编译器虽然也能通过,但这是错误的,因为是个指针,定义时指向不可用的地址。解决这个问题有两种方法:用数组的方法或给字符针针分配内存空间的方法。
    数组的方法:
                 char name[20];
                 scanf("%s",name);
                 printf("%s",name);
     
    给字符针针分配内存空间的办法:
                 char *name;
                 name=(char*)malloc(50);      //此时name已经指向一个刚刚分配的地址空间。
                 scanf("%s",name);
                 printf("%s",name);

原文地址:https://www.cnblogs.com/xmhsincere/p/4915354.html