zoukankan      html  css  js  c++  java
  • C++中字符数组和字符指针问题

    环境:vs2010

    说明:在阅读这部分内容之前应该先明确C++内存分配问题 ,那一篇文章说的比较清楚。

    1.字符数组,初始化:

    char str1[]="abc";
    char str1[]={"abc"};
    char str1[]={'a','b','c',''};//如果没有,运行通过,但有不可以意料的结果
    char str1[5]="abc";//字符数量<5,因为必须包含尾巴

    一些操作:

    str1[1]='g';//更改字符串中某个值
    cout<<str1;//输出字符串
    printf("%s",str1);
    strcpy(str1,"123");//字符串拷贝
    str1="456";//更改字符串

    一些正确使用和错误使用对比:

    *str1="bcd";//错误,*str仅仅是指向字符串的首指针,因此*str1代表第一个字符,

    *str1='1';//正确,更改第一个字符,字符串str1变为“1bc”

    *str1++;//错误,这是char *str1的用法

    2.字符指针,初始化:

    char *str2="123";

    char *str2=NULL;

    char *str2=0;//同上一个,置为空

    字符指针一些操作:

    cout<<str2;//输出字符串
    printf("%s",str2);
    //strcpy(str2,"123");//错误,指针字符串不能拷贝,
    str2="456";//更改字符串正确方法!!!

    一些错误操作:

    *str2="asdf";//错误,str2指向常量数据区,这样不能更改字符串

    strcpy(str2,"123");//错误,不能这样拷贝,常量数据区无法更改

    *str2='q';//错误。同第一个,这更改的str2指向的常量数据区,而常量数据区是不能更改的!

    PS1:由此可见字符数组和指针数组还是有很多相似的地方!也就是说,还有很多不同的地方(o(╯□╰)o废话)

     PS2:*str2 = "asdf";中的str2为什么会指向内存常量区域呢?是因为编译器会在指针初始化时把*str2指向的内容当做常量处理,进而放在常量区域,因此不能修改。其实,编译器在给字符指针*str2赋值"123"时,会先查询常量区域是否有"123",如果有,会在栈中(假设是普通变量)生成一个直接指向这个常量地址的指针;如果没有,会先在常量区域生成"123"字符串,再在栈中生成一个指向这个常量地址的指针。这里要区别与new一个字符串的区别(new一个会在堆内存中分配一个新的"123",不管以前有没有,java中的String保留了这个规则,并且特别注意,C++中堆内存分配后,要用对应的delete/free释放内存!)。

  • 相关阅读:
    JAVA如何调用C/C++方法
    java如何去调用C++的方法详解
    在运行时刻更新功能模块
    运用加密技术保护Java源代码/定制ClassLoader
    JAVA 利用JNI加密class文件/自定义ClassLoader 类
    java本地方法如何调用其他程序函数,方法详解2
    java本地方法如何调用其他程序函数,方法详解
    JAVA本地方法详解,什么是JAVA本地方法?
    java随机生成简体中文取指定长度随机简体中文实用方法
    导入安全证书到jdk步骤详细说明-原
  • 原文地址:https://www.cnblogs.com/fengfengqingqingyangyang/p/3225685.html
Copyright © 2011-2022 走看看