精华内容
下载资源
问答
  • 一、字符串常量和字符串变量 我们知道字符串常量是存储在文字常量区,也即C++中的静态存储区。 而字符串变量一般定义在栈区,当使用malloc时则定义在堆区。 char* ss = "hello world"; printf("%p\n", &ss...

    C++中内存布局,内存地址:栈区>堆区>静态存储区

    一、字符串常量和字符串变量

    我们知道字符串常量是存储在文字常量区,也即C++中的静态存储区。

    而字符串变量一般定义在栈区,当使用malloc时则定义在堆区。

      char* ss = "hello world";
      printf("%p\n", &ss); //字符串变量ss的存储地址(变量声明的地址)
      printf("%c: %p\n", ss[0],  &(ss[0]));//字符串变量ss中第一个字符h的存储地址
      printf("%c: %p\n", ss[1],  &(ss[1]));//字符串变量ss中第二个字符e的存储地址
      printf("%p\n", &"hello world");//字符串常量的首地址
      printf("%p\n", &("hello world"[0]));//字符串常量第一个字符h的存储地址
      printf("%p\n", &("hello world"[1]));//字符串常量第二个字符e的存储地址
      /*
      0x7fffecff31b8 栈区
      h: 0x401420    静态存储区
      e: 0x401421    静态存储区
      0x401420       静态存储区
      0x401420       静态存储区
      0x401421       静态存储区
      */
    
    /*用malloc申请内存*/
      char* ss = (char*)malloc(128);
      memset(ss, 0, 128);
      strcpy(ss, "hello world");
      printf("%p\n", &ss); //字符串变量ss的存储地址(变量声明的地址)
      printf("%c: %p\n", ss[0],  &(ss[0]));//字符串变量ss中第一个字符h的存储地址
      printf("%c: %p\n", ss[1],  &(ss[1]));//字符串变量ss中第二个字符e的存储地址
      printf("%p\n", &"hello world");//字符串常量的首地址
      printf("%p\n", &("hello world"[0]));//字符串常量第一个字符h的存储地址
      printf("%p\n", &("hello world"[1]));//字符串常量第二个字符e的存储地址
      /*
      0x7ffc38cae008   栈区
      h: 0x628130      堆区
      e: 0x628131      堆区
      0x401470         静态存储区
      0x401470         静态存储区
      0x401471         静态存储区
      */
    1. 字符串变量存储在静态存储区;
    2. 在栈区声明一个字符串变量,char* ss = "hello world";这句代码会将栈区变量ss指向静态存储区的字符串,因此访问栈区ss变量时,是访问了静态存储区的"hello world"。
    3. 在栈区声明一个字符串变量,char* ss = (char*)malloc(128);这行代码在堆区申请了一块128字节的内存,并将栈区变量ss指向这块堆内存,strcpy(ss, "hello world");则将静态存储区的字符串拷贝至堆区。

    其他需要注意的点:

    我们在栈区char* ss时,只是在栈区声明了一个字符串变量,如果想使用strcpy拷贝字符串,则目的地址必须是申请的堆空间字符串变量地址,或者是栈空间的字符数组。
    //  char* ss;
    //  strcpy(ss, "hello world");//错误,不能讲常量字符串拷贝至一个字符串变量,因为该字符串变量没有申请空间存储
    
      char ss[128];
      memset(ss, 0, 128);
      strcpy(ss, "hello world");//正确,ss是栈空间的字符数组

     

    二、string变量

    string是C++定义的类,在其实现中,数据内容存储在堆空间中,在对象析构时将会释放其申请的堆内存,还要注意的是使用string的“+”运算符等时,拼接到一起的字符串其地址空间可能是不连续的。

      string tmpstr = "hello world";
      printf("tmpstr: %p\n", &tmpstr);//string变量tmpstr的存储位置
      printf("%c %p\n", tmpstr[0],  &(tmpstr[0]));//tmpstr变量中字符串第一个字符h存储的位置
      printf("%c %p\n", tmpstr[1],  &(tmpstr[1]));//tmpstr变量中字符串第二个字符e存储的位置
      printf("%c %p\n", tmpstr[10],  &(tmpstr[10]));//tmpstr变量中字符串第11个字符d存储的位置
    
      tmpstr += "123";//拼接一段字符串
    
      printf("%c %p\n", tmpstr[11],  &(tmpstr[11]));//拼接后的tmpstr第12个字符1存储的位置
      printf("%c %p\n", tmpstr[12],  &(tmpstr[12]));//拼接后的tmpstr第13个字符2存储的位置
      printf("%p\n", &"hello world");//"hello world"字符串首地址
      printf("%p\n", "hello world");
    
      /*
       tmpstr: 0x7ffe73dbd690 栈区
        h 0x9bf028            堆区
        e 0x9bf029
        d 0x9bf032
        1 0x9bf063
        2 0x9bf064
        0x400d20              静态存储区
        0x400d20
       */

     

    展开全文
  • 1.错解 String str="123"; if(str.equals("123")){ } 2.正解 String str="123"; if("123".equals(str)){ } 3.分析 字符串常量斜前面,避免空指针异常。

    1.错解

    String str="123";
    if(str.equals("123")){
    }
    

    2.正解

    String str="123";
    if("123".equals(str)){
    }
    

    3.分析
    字符串常量斜前面,避免空指针异常。

    展开全文
  • s就是字符串常量,"abc"也是字符串常量。字符串里面的字符的值不能再改变了 主串子串 char s[] = "abcdef";其中s全部的字符串"abcdef",就是主串,其中连续的一部分,例如"abc","bcde","ef"等都可...

    空字符串

    char s[]="";

    即第dao一个字符是'\0'

     

    空格字符

    char s[]="   ";

    只有空格组成的字符串字符串变量

     

    char s[] = "abc";

    s就是字符串变量

     

    char *s = "abc";

    s就是字符串常量,"abc"也是字符串常量。字符串里面的字符的值不能再改变了

     

    主串和子串

    char s[] = "abcdef";其中s全部的字符串"abcdef",就是主串,其中连续的一部分,例如"abc","bcde","ef"等都可以叫子串。

     

    串变量的名字与串变量的值

    char s[] = "abcdef";

    s是串的名字,"abcdef"是串的值。

    展开全文
  • 为了了解字符串常量相加字符串变量相加,首先看一个小例子: public class SocketTest { public static void main(String[]args)throws Exception{ String str1="abc"; String str2="abc"; String str3=...

    关键词:字符串常量、字符串变量(引用)

    为了了解字符串常量相加和字符串变量相加,首先看一个小例子:

    public class SocketTest {
    	public static void main(String[]args)throws Exception{
    		String str1="abc";
    		String str2="abc";
    		String str3="eee";
    		String str4="abceee";
    		String str5=str1.concat(str3); //底层源码:用了new,创建了新对象
    		System.out.println("abc"+"eee"=="abceee");//第一种情况:字符串常量相加,不含字符串变量
    		System.out.println("abc"+"eee"==str4);
    		System.out.println("abc"+str3=="abceee");//第二种情况:含字符串变量相加
    		System.out.println(str1+str3=="abceee");
    		System.out.println(str4==str5);
    	}
    }
    
    //输出的结果:
    true
    true
    false
    false
    false

    分析:

    1 字符串相加时如果含有字符串变量,则先在堆中开空间,再拼接,本质是new了StringBuilder对象进行append操作,拼接后调用toString()返回String对象。 

    2 字符串相加时不含字符串变量,是先加,然后在常量池找,如果有就直接返回,否则,就在常量池中创建一个字符串常量,不会用到StringBuilder。 

    展开全文
  • 字符串变量相加vs字符串常量相加 public static void main(String[] args) { String s1 = "hello"; String s2 = "world"; String s3 = "helloworld"; System.out.println(s3==s1+s2);//结果为false System.out....
  • 字符串常量和字符串变量区别

    千次阅读 2018-12-01 23:11:44
    //字符串变量 char* s2 = “abc”;//字符串常量,先在常量区存储"abc",s2直接指向常量区的"abc" char s3[] = “abc”;//字符数组,先在常量区存储"abc",然后在栈区申请内存空间,将"...
  • 字符串常量和字符串变量 https://blog.csdn.net/zangz/article/details/83987430 string s1 = "abc"; //字符串变量 char *c1 = "abc"; //字符串常量 char c2[] = "abc"; //字符数组, s1[0]='d'; (√) c1[0]='d'; ...
  • 字符串常量 定义:在一个双引号""内的字符序列或者转义字符序列称为字符串常量 例如:“HA HA!” “abc” “\n\t” 这些字符串常量是不能改变的,如果试图改变指针所指向的内容是错误的 因为字符串常量是...
  • 字符串常量和字符串变量C++

    千次阅读 2018-08-15 14:16:01
    #include <iostream> #include <string> using namespace std;...//字符串变量 ...//字符串常量,先在常量区存储"abc",s2直接指向常量区的&am
  • 字符串常量是由双引号括起来的字符集合,它实际上就是这些字符组成的一维字符数组,因此它的字面值是第一个字符的地址。 字符串变量分两种情况: 由一维字符数组定义的,如:char a[10]。其中字符串变量a代表的也是...
  • 字符串常量和变量区别

    千次阅读 2018-11-12 10:03:00
    //字符串常量,先在常量区存储"abc",s2直接指向常量区的"abc" char s3[] = “abc”;//字符数组,先在常量区存储"abc",然后在栈区申请内存空间,将"a
  • C语言学习中的知识点,字符指针字符数组的区别,静态全局变量、静态局部变量、全局变量和局部变量区别, 有错误的地方请大家指正! 以下程序用VC++6.0调试 先说说字符指针字符数组的区别 1. 相同点: /*...
  • #define _CRT_SECURE_NO_WARNINGS #include<...//1.const修饰的全局变量,即使语法通过,但是运行的时候会受到常量区的保护,运行失败 const int a = 10; //const放在常量去,表示该变量不能被修改 void...
  • 实型变量 1、实型变量的舍入误差 因为内存分配给实型变量的空间是有限的,所以当存储数据时,就会遇到舍入的问题,我们举个例子 void main() { float a,b; a=123456.789e5; b=a+20; printf("%f\n",a); printf("%f\n...
  • 字符串常量与静态变量 在堆内存中 运行时常量池在方法区中
  • 字符串常量与字符串变量区别

    千次阅读 2010-03-12 00:46:00
    字符串常量和字符串变量一样,都是一个一维字符数组。两者的区别在于:字符串变量的名字(一维字符数组名)及其所需的存储空间是显式定义的,并通过名字来引用相应的字符串变量。而字符串常量所需的存储空间是隐式...
  • 字符串常量和变量

    2018-10-17 22:42:57
    字符串常量: 定义:在一个双引号""内的字符序列或者转义字符序列称为字符串常量 例如:“HA HA!” “abc” “\n\t” 这些字符串常量是不能改变的,如果试图改变...字符串变量: 在C语言中没有纯粹的c...
  • ava中字符对象创建有两种形式,一种为字面量形式,如String str = "droid";...然而这两种实现其实存在着一些性能内存占用的差别。这一切都是源于JVM为了减少字符对象的重复创建,其维护了一个特殊的内存,这段
  • java的变量和常量以及常量

    千次阅读 2017-10-24 17:39:10
    首先变量和常量名都是用户自行定义的标志符,遵循先定义后使用的原则,常量和变量区别常量之后会不会改变 变量 占据着内存的某一存储区域,该区域有自己的名称数据类型,该区域的数据可以在同一...
  • 这一切都是源于JVM为了减少字符串对象的重复创建,其维护了一个特殊的内存,这段内存被成为字符串常量池或者字符串字面量池。 工作原理 当代码中出现字面量形式创建字符串对象时,JVM首先会对
  • public class StringDemo3 { public static void main(String[] args) { String s1 = "hello"; String s2 = "world";... // 字符如果是变量相加,先开空间,在拼接 System.out.println(s3 == s1 + ...
  • 符号常量和变量区别: 常变量:具有变量的特征是存在一个以变量名命名的存储单元,在一般情况下,存储单元中的内容是可以变化的。而对于常变量,在变量的基础上加了一个限定:存储单元中的内容不允许变化,仍然...
  • ava中字符对象创建有两种形式,一种为字面量形式,如String str = "droid";,另一种就是使用new这种标准的构造对象的方法,如String str = new String("droid");,这两种方式我们在代码编写时...
  • 字符串常量与字符串变量

    千次阅读 2015-03-29 21:00:32
    定义:在一个双引号“ ”内的字符序列或者转义字符序列称为字符串常量 例如:“HI HI!” “a” “\n\t” ...这些字符串常量是不能改变的,...因为字符串常量是存在静态内存区的,不可以改变字符串变量。 如定义
  • JAVA字符串常量和变量

    2020-09-16 17:35:41
    其中String为字符串常量,StringBuffer、StringBuilder均为字符串变量。即:String对象创建后是不可以更改的,举个例子说明一下: String str="abc"; str=str+"de"; System.out.println(str); 首先第一行创建一个...
  • String 字符串常量 StringBuffer 字符串变量(线程安全) StringBuilder 字符串变量(非线程安全)  简要的说, String 类型 StringBuffer 类型的主要性能区别其实在于 String 是不可变的对象, 因此在每次对 ...
  • C++中字符串常量与字符串变量

    千次阅读 2017-05-15 21:40:53
    刚开始我认为字符串常量在使用指针来给其他的字符串变量赋值时,原来的字符串在改变时,会导致指向该地址的字符串变量也改变。 但是一个很重要的概念就是 字符串常量存储空间里的内容不能被改变,并且只有在程序...
  • Java中字符串相加字符串常量相加区别

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 362,927
精华内容 145,170
关键字:

串变量和串常量的区别