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

    今天还在做着小作业,终于把框架大体搭好,准备脱离stl用c语言来解析字符串。却碰到了诸多问题。
    原来堆栈基本不太懂,现在稍稍知道了,还有字符串指针和数组的区别。哎
    简单的写了几个定义和初始化字符串的方式
     char *szName1 = "  dir \ad\ what are you doing"; //  q全局const区域
     char szName2[] = "  dir \ad\ what are you doing";//栈 区
     char *szName3 = new char[64];                   //堆区
     szName3 = "  dir \ad\what are you doing";
     char *szName4 = szName2;                      //栈区的指针指向栈区的内存
    debug一看,原来果真只有 szName[2]是char[]型
    debug信息:

    -  szName1 0x0041564c "  dir dWhat are you doing" char *
       32 ' ' char
    -  szName3 0x0041564c "  dir dWhat are you doing" char *
       32 ' ' char
    -  szName4 0x0012ff38 "  dir dWhat are you doing" char *
       32 ' ' char
    -  szName2 0x0012ff38 "  dir dWhat are you doing" char [27]
      [0] 32 ' ' char
      [1] 32 ' ' char
      [2] 100 'd' char
        ......
    我理解是:
      指针保存的仅仅是这个串的首地址,而串数组保存了整个串的信息,数组名可以用来访问首地址,但并不是一个指针!

    我写了一个函数是要传递指针的指针,当我把szName1, szName3, szName4取地址传过去可以,但是传递&szName2就不行了,提示错误是不能实现数组的指针向指针的指针 转换。
    我曾经试图传递指针的引用来实现修改字符串指针的功能,szName1, szName3, szName4也可以实现引用的传递,而szName2 还是不行。其实我想得到一个官方的解释,暂时就先这样理解了。



    char amessage[] = "now is the time"; /* an array */
    实际上等同于
    char amessage[16] ;
    strcpy(amessage, "now is the time" ;
    16是字符串"now is the time"的长度加1.
    可以看出内存空间是分配在栈上的.

    char *pmessage = "now is the time"; /* a pointer */
    而pmessage指向的内容始终是常量,不可能被改变的.
    而p = strdup(a)实际上等同于
    p = (char*)malloc(strlen(a) + 1) ;
    strcpy(p, a) ;
    可以看出来,strdup返回的指针指向的是在堆上新分配的内存.
    要修改也是修改新分配的内存空间中的内容.不是原来a指向的内容.



    程序代码:

    #include "stdio.h"
    #include  "string.h"

    const int MAX_LENGTH = 256;


    void StrReStrEx(char **pnewstr, char c)
    {
     size_t i = 0;
     for (; i<strlen(*pnewstr); i++)
     {
      if ((*pnewstr)[i] != c)
      {
       break;
      }
     }
     *pnewstr = *pnewstr+i;
    }

    void StrReStrEx1(char *&newstr, char c)
    {
     size_t i = 0;
     for (; i<strlen(newstr); i++)
     {
      if ((newstr)[i] != c)
      {
       break;
      }
     }
     newstr = newstr+i;
    }

    int main()
    {
     char *szName = "  dir \ad\What are you doing"; //  q全局const区域
     char szName2[] = "  dir \ad\What are you doing";//栈 区
     char *szName3 = new char[MAX_LENGTH];            //堆区
     szName3 = "  dir \ad\What are you doing";
     char *szName4 = szName2;                   //栈区的指针指向栈区的内存
     printf("%s\nszName:%d\n",szName, strlen(szName));

     char *temp = szName;
     StrReStrEx1(szName, ' ');
     printf("%s\nszName1:%d\n",szName, strlen(szName));

     StrReStrEx1(szName3, ' ');
     printf("%s\nszName3:%d\n",szName3, strlen(szName3));

     StrReStrEx1(szName4, ' ');
     printf("%s\nszName4:%d\n",szName4, strlen(szName4));

    //  StrReStrEx1(szName2, ' ');
    //  printf("%s\nszName:%d\n",szName2, strlen(szName2));
     return 0;
    }

  • 相关阅读:
    html之长文本框置顶
    Red Hat Enterprise Linux Server 6.5安装GCC 4.9.2
    精通正则表达式
    解决UNION ALL合并两个结果集后排序的问题
    ELK搭建日志管理系统记录
    Spring Boot使用@ConfigurationProperties 读取自定义的properties的方法
    maven配置profile,按指定环境打包
    java自定义标签,tld文件,获取数据字典的值
    JAVA实现RSA签名、验签
    jquery.validate.js中的remote用法
  • 原文地址:https://www.cnblogs.com/hellohuan/p/1246187.html
Copyright © 2011-2022 走看看