• c++字符指针


      对于C/C++中的 字符指针和字符数组,总是在碰到的时候无法确定而不得不现场测试,来确定末尾是否包含'',函数到底如何使用等等。真是劳民伤财,现在总结一下:

    字符指针的赋值

    (1)指向一个字符串常量

    char *src = "abcded"; //这种方式由系统自动给该字符指针指定了一个内存中的位置,并且该位置的字符数组为{'a', 'b', 'c', 'd', 'e', 'd', ''};

    如果此时再次对 src赋值,src = "mmmt", 则src指向另外一个由系统指定的内存块。这种方式赋值的src为一个指向字符串常量指针,不能对src指向的位置的内容做改变的操作,即不能执行 *src = 'a', *(src+1) = 't' 等操作;但是可以改变src指向的位置,即像之前的 src = "mmmt";

    (2)指向一个字符数组

    char tmp[4] = {'a', 'c', 'e', 'f'};

    char* src = tmp;  

    (3)使用  new,然后可以像字符数组一样赋值,即指向一个字符数组

    char* src = new char[10]; //这种方式由程序在堆内存上开辟了一个数组,并将地址赋值给src

    字符串常量和字符数组比较

    (1)字符串常量由系统自动分配一个内存区域,且该区域中的内容不能改变(即无法通过指向该字符串的指针进行修改);

    (2)字符数组或者为系统自动分配的全局数据区或栈上的内存,或者通过new操作来分配的堆上的内存,字符数组中的内容可变(即可以通过指向该字符数组的指针进行修改)。

    (3)字符数组中不默认含有'',除非明确赋值,而字符串常量在末尾自动含有 ''.

    strcpy的使用

    (1)用strcpy时候, 如果源字符串是一个字符指针,则没有问题,因为字符指针自动带'',在''位置复制结束;

      而如果源是一个字符数组(即将字符数组转换为字符指针来使用),则将会从字符数组的首地址开始复制,如果字符数组中明确指定了''元素,则会在''处停止,而若没有''元素,则程序可能会不停的复制,直到在程序的内存中碰到'',这样可能会得到不希望的结果。

    (2)用strncpy的时候注意,这里只管复制n个字符,如果前n个字符中含有'',则会在''处停止,否则,一直复制n个。

      在写程序的时候,如果目的字符串之前没有被memset清空,下次使用strncpy来为它赋值,则有可能它之前的长度大于n,则会导致不期望的结果。比如

    char* dst = "abcdedf";

    char* src = "12345";

    strncpy(dst, src, 3);

    则dst此时变为了 123dedf

  • 相关阅读:
    java实现动态上传多个文件并解决文件重名问题
    MySQL存储过程之事务管理
    Java IO--字符流--InputStreamReader 和 OutputStreamWriter
    Java IO--字符流--BufferedReader和BufferedWriter
    java线程同步小结
    进程和线程的区别与联系
    java中“==”和equals方法的区别,再加上特殊的String引用类型
    java.util.Date 与 java.sql.Date 之间的转换
    Java Applet 与Servlet之间的通信
    Applet 应用程序进行数字签名,对系统文件进行读写操作
  • 原文地址:https://www.cnblogs.com/gtarcoder/p/4729658.html
Copyright © 2020-2023  润新知