zoukankan      html  css  js  c++  java
  • 字符串数组与字符串指针

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

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

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

      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);

  • 相关阅读:
    win8 vs2010 openni2 配置
    写一个程序,分析一个文本文件(英文文章)中各个词出现的频率,并且把频率最高的十个词打印出来。
    电梯调度
    new 一个button 然后dispose,最后这个button是null吗???
    org.apache.hadoop.security.AccessControlException
    算法导论第二章、插入排序
    算法导论第六章、堆排序
    算法导论第八章、计数排序
    观后感
    第二次随笔
  • 原文地址:https://www.cnblogs.com/xmhsincere/p/4915354.html
Copyright © 2011-2022 走看看