首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

C语言字符串常量

C语言字符串常量 一.字符串常量的声明 char *p = "hello";//指针直接往上戳 一个字符串常量为什么会给一个指针赋值? ...字符串常量是一个表达式,既然使表达式就会有值,字符串常量的值是该字符串第一个字母的首地址 同一个字符串常量,它们的值(地址)相同 #include ...,输出的结果却一样,这就说明多次使用同样内容的字符串常量,在内存中,都只保存一次该字符串常量。...结论:字符串本身是有值的,就是第一个字符的地址。...2.如果要修改字符串的值,我们只能使用字符数组的形式来存储字符串,可以这样声明:char str[] = "hello";,这样就可以修改了,它两本质上的不同是存储的位置不同。

5.6K20

Java中的字符串常量池

工作原理 当代码中出现字面量形式创建字符串对象时,JVM首先会对这个字面量进行检查,如果字符串常量池中存在相同内容的字符串对象的引用,则将这个引用返回,否则新的字符串对象被创建,然后将这个引用放入字符串常量池...JVM通过字符串常量池查找不到内容为droid的字符串对象存在,那么会创建这个字符串对象,然后将刚创建的对象的引用放入到字符串常量池中,并且将引用返回给变量str1。...字符串常量池实现的前提条件就是Java中String对象是不可变的,这样可以安全保证多个变量共享同一个对象。...如果Java中的String对象可变的话,一个引用操作改变了对象的值,那么其他的变量也会受到影响,显然这样是不合理的。 引用 or 对象 字符串常量池中存放的时引用还是对象,这个问题是最常见的。...字符串常量池存放的是对象引用,不是对象。在Java中,对象都创建在堆内存中。 更新验证,收到的很多评论也在讨论这个问题,我简单的进行了验证。

1.2K20
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    字符型常量和字符串常量的区别?

    形式上: 字符常量是单引号引起的一个字符;字符串常量是双引号引起的 0 个或若干个字符。 2....含义上: 字符常量相当于一个整型值( ASCII 值),可以参加表达式运算;字符串常量代表一个地址值(该字符串在内存中存放位置)。...int n1 = 'A'; // 字母“A”的Unicodde编码是65 int n2 = '中'; // 汉字“中”的Unicode编码是20013 还可以直接用转义字符\u+Unicode编码来表示一个字符...: // 注意是十六进制: char c3 = '\u0041'; // 'A',因为十六进制0041 = 十进制65 char c4 = '\u4e2d'; // '中',因为十六进制4e2d = 十进制...占内存大小:字符常量只占 2 个字节;字符串常量占若干个字节 (注意:char 在 Java 中占两个字节)。 4.

    2.9K20

    jvm常量池和字符串常量池_常量池中的字符串是对象吗

    大家好,又见面了,我是你们的朋友全栈君 JVM——字符串常量池详解 引言 在Java开发中不管是前后端交互的JSON串,还是数据库中的数据存储,我们常常需要使用到String类型的字符串。...作为最常用也是最基础的引用数据类型,JVM为String提供了字符串常量池来提高性能,本篇文章我们一起从底层JVM中认识并学习字符串常量池的概念和设计原理。...字符串常量池由来 在日常开发过程中,字符串的创建是比较频繁的,而字符串的分配和其他对象的分配是类似的,需要耗费大量的时间和空间,从而影响程序的运行性能,所以作为最基础最常用的引用数据类型,Java设计者在...JDK1.7之前 在jdk1.7之前,常量池是存放在方法区中的。 JDK1.7 在jdk1.7中,字符串常量池移到了堆中,运行时常量池还在方法区中。...变化 在JDK1.7前,运行时常量池+字符串常量池是存放在方法区中,HotSpot VM对方法区的实现称为永久代。 在JDK1.7中,字符串常量池从方法区移到堆中,运行时常量池保留在方法区中。

    53120

    C语言入门之变量、常量、字符串、转义字符

    #define 定义的标识符常量 4.枚举常量 代码如下:         注1:上面例子上的 pai 被称为 const 修饰的常变量, const 修饰的常变量在C语言中只是在语法层面限制了变量...注2:枚举常量的默认值是可以更改的,也就是说在定义枚举常量的时候可以给其赋初始值。 三、字符串 "Hello World....\n"          这种由双引号(Double Quote)引起来的一串字符称为字符串字面值(String Literal),或者简称字符串。字符串的结束标志是一个 \0 的转义字符。...在计算字符串长度的时候 \0 是结束标志,不算作字符串内容。...在书写连续多个问号时使用,防止他们被解析成三字母词 \' 用于表示字符常量' \“ 用于表示一个字符串内部的双引号 \\ 用于表示一个反斜杠,防止它被解释为一个转义序列符 \a 警告字符,蜂鸣 \b 退格符

    26710

    常量和字符串(C语言初阶细致)

    (大佬大佬) printf(“%d\n”, strlen(“c:\test\628\test.c”)); 答案:查看目录对答案 文章目录 常量的分类 字面常量 const修饰的常变量 #define...定义的标识符常量 enum枚举常量 字符类型 字符与字符串比较 转义字符(答案在这) 常量的分类 常量和变量的比较: int a=10;//a就是变量 char ch=b;//b就是常量,常量只能以作为左值出现...标识符:C语言规定,标识符可以是字母、数字、下划线(A~Z, a~z, 0~9, _)组成的字符串,并且第一个字符必须是字母或下划线。 2....3.14 #define定义的不局限于整数,还可以是字符串 备注:#define末行习惯不加分号; 打印字符串一定一定要加双引号 enum枚举常量 枚举类型:即是可以被一一列举出来的常量,把他们组合起来形成的一个集合...’,‘b’,‘c’};中手动添加一个’\0’,变成: char ch1[] = {‘a’,‘b’,‘c’,‘\0’’}; 借用strlen来求字符串长度: Q:什么是strlen?

    67770

    c++中常量表达式_定义字符串常量

    大家好,又见面了,我是你们的朋友全栈君。 C++中的const关键字可以声明运行时常量,但有的时候需要编译时常量。 例如定义数组需要的是编译时常量。...C++11通过constexp来声明常量,具有编译时常量性。...,该函数具有以下限制: 函数中只能有一条return语句 函数必须有返回值 在使用前必须定义 return返回语句表达式中不能使用非常量表达式的函数、全局数据。...如果将一个变量或成员函数标记为constexpr,则同样它是const的。但相反并不成立,一个const的变量或函数,并不是constexpr的。...如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

    59820

    什么是字符串常量池_常量池中的字符串是对象吗

    在工作中,String类是我们使用频率非常高的一种对象类型。JVM为了提升性能和减少内存开销,避免字符串的重复创建,其维护了一块特殊的内存空间:字符串常量池。字符串常量池由String类私有的维护。...堆里边的字符串常量池存放的是字符串的引用或者字符串(两者都有) 比如new String(“test”)就会先在常量池中检查是否存在,不存在则在常量池中创建,然后堆中创建其引用。...常量池和字符串常量池的版本变化 在JDK1.7之前运行时常量池逻辑包含字符串常量池存放在方法区, 此时hotspot虚拟机对方法区的实现为永久代 在JDK1.7 字符串常量池、静态变量等被从方法区拿到了堆中...(2)不存在: ① jdk 1.6:先在字符串常量池中创建该字符串,地址与堆中字符串地址不相同。然后再返回刚创建的字符串在字符串常量池中所对应的地址给栈中要引用这个字符串的变量。...② jdk 1.7及以后:直接将堆中(不是字符串常量池中)该字符串的地址复制到字符串常量池中,这样字符串常量池就有了该字符串的地址引用,也可以说此时字符串常量池中的字符串只是一个对 堆中字符串对象的引用

    48140

    Java中的常量池【Class常量池、运行时常量池、字符串常量池】

    在解析阶段,会把符号引用替换为直接引用,解析的过程会去查询字符串常量池,也就是StringTable,以保证运行时常量池所引用的字符串与字符串常量池中是一致的。...字符串常量池 字符串常量池在Java内存区域的哪个位置? 在JDK6.0及之前的版本,字符串常量池是放在Perm Gen区(也就是方法区)中; 在JDK7.0版本,字符串常量被移到了堆中。...在之前版本中,里放的都是字符串常量 在中,由于发生了改变,因此中也可以存放放置在堆内的字符串对象的引用。...⚠️字符串常量池中的字符串只存在一份,且被所有线程共享 ⚠️全局字符串池里的内容是在类加载完成,经过验证、准备阶段之后在堆中生成字符串对象实例,然后将该字符串对象实例的引用值存到中;中存的是引用值而不是具体的实例对象...在JDK1.7字符串常量池和静态变量被从方法区拿到了堆中,运行时常量池剩下的还在方法区,也就是HotSpot的永久代中。

    1.7K20

    运行时常量池与字符串常量池_字符串常量池在堆中还是方法区

    一般包括下面三类常量: 类和接口的全限定名 字段的名称和描述符 方法的名称和描述符 描述符 是描述字段或方法的类型的字符串。...是在类加载完成,经过验证,准备阶段之后 在 堆 中生成字符串对象实例,然后 将该字符串对象实例的 引用值 存到 String Pool 中。...),也就是说在堆中的某些字符串实例被这个 StringTable 引用之后就等同被赋予了”驻留字符串”的身份。...4、总结 class常量池 是在编译的时候每个class都有的,在编译阶段,存放的是常量的 符号引用 。 字符串常量池 在每个VM中只有一份,存放的是字符串常量的 引用值 。...字符串常量池 中的引用值保持一致。

    99120

    字符串常量池 运行时常量池_常量池中的字符串是对象吗

    ,无法进行扩容操作,并且字符串种类复杂,很可能发生哈希碰撞现象,一旦字符串在哈希表中形成了链表等数据结构,就会使字符串常量池的性能下降,所以字符串常量池中需要加入垃圾回收机制。...字符串常量池在JVM中的位置变化: jdk6及之前在方法区中,但是在jdk6中已经有向对堆中迁移的趋势。...这个后面重点谈 Java 6及以前,字符串常量池存放在永久代 Java 7中 Oracle的工程师对字符串池的逻辑做了很大的改变,即将字符串常量池的位置调整到Java堆内 所有的字符串都保存在堆...字符串常量池概念原本使用得比较多,但是这个改动使得我们有足够的理由让我们重新考虑在Java 7中使用String.intern()。 Java8元空间,字符串常量在堆中。...: 调试区域中勾选该选项可以查看String类在内存中的详情: 进行调试我们会发现,在输出10个String后,再次输出相同的字符串,而字符串常量池中没有在创建新的字符串常量对象: 示例二 /

    27120

    【错误记录】C 语言中通过指针操作字符串常量出错记录 ( 只有 栈内存 或 堆内存 中的数据才能通过指针修改 | 不要通过指针修改常量区的字符串 )

    // 记录 p_start 指针指向的首部字符 char c = *p_start; // 将尾部字符赋值给首部字符 *p_start = *p_end;...// 将首部字符赋值给尾部字符 *p_end = c; // 指向头部的指针自增 p_start++; // 指向尾部的指针自减...char *str = "sdfsdfsdabc4548411abc"; 字符串导致 , 该字符串存储在 全局区 的 常量区 ; char *str 指针指向了 常量区 ; 之后 , 通过指针尝试修改该常量区的字符串...将尾部字符赋值给首部字符 *p_start = *p_end; // 将首部字符赋值给尾部字符 *p_end = c; 修改方案 : 将字符串定义为如下样式..., 字符串在 栈区 和 常量区各有一份 , 可以任意修改栈区的字符串 , 常量区的字符串仅用于赋值操作 ; // 将下面的字符串翻转 char str[] = "sdfsdfsdabc4548411abc

    61410

    c语言字符串赋值_c++中字符串变量

    大家好,又见面了,我是你们的朋友全栈君。 从大一学c语言到现在都快三年了,今天居然还在简单的字符串赋值的过程中犯了错误,应该记下来,以免日后再犯。...这是一个结构体 typedef struct student { char name[21]; char sno[21]; int grade; } student; 现在又两个student 类型的变量...stu1,stu2,当我想把stu2的值赋给stu1是我一开始是这样做的 stu1.name =s tu2.name; stu1.sno = stu2.sno; stu1.grade = stu2.grade...后来才发现字符数组不可以用“=”赋值,而是需要strcpy()函数; 但是如果把把字符串数组改成string类型,就可以直接用“=”赋值了。...如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

    2.2K30

    常量池和堆的区别_字符串常量池在堆中还是方法区

    看下面两张图: 在堆中的字符串常量池: **堆里边的字符串常量池存放的是字符串的引用或者字符串(两者都有)**下面例子会有具体的讲解 符号引用表会在下面讲 我们知道,在Java中有两种创建字符串对象的方式...,JVM首先在字符串常量池中查找有没有”aaa”这个字符串对象,如果有,则不在池中再去创建”aaa”这个对象了,直接在堆中创建一个”aaa”字符串对象,然后将堆中的这个”aaa”对象的地址返回赋给引用str1...,这样,str1就指向了堆中创建的这个”aaa”字符串对象;如果没有,则首先在字符串常量池池中创建一个”aaa”字符串对象,然后再在堆中创建一个”aaa”字符串对象,然后将堆中这个”aaa”字符串对象的地址返回赋给...字符串常量池被从方法区拿到了堆中, 这里没有提到运行时常量池,也就是说 字符串常量池被单独拿到堆,运行时常量池剩下的东西还在方法区, 也就是hotspot中的永久代 在JDK1.8 hotspot移除了永久代用元空间...另外美团的团队写了一篇关于intern()的博客,我觉得很好可以参考一下 深入解析String#intern 4.3字符串常量池里存放的是引用还是字面量 我在例子3中讲了在JDK7中字符串常量池在堆上

    1.2K30

    《挑战30天C++入门极限》CC++中字符串常量的不相等性及字符串的Copy

    C/C++中字符串常量的不相等性及字符串的Copy #include void main(void) { if("test"=="test...cout<<"相等"; } else { cout<<"不相等"; } }   上面的代码我们测试两个内容为test的字符串常量是否相等...,按照常理,应该是相等的,这些在一些过程式语言中会得到相等的结论,但在c/c++却不是这样。   ...答案在这里:因为字符串常量存储在计算机内存中,两个字符串常量的地址均不相同,所以这样的比较自然就不会得到我们所需要的结果,如果要进行是否相等的比较应该使用strcmp()这个涵数进行比较!...strcpy用来处理字符串数学组的copy,由于字符串数组属于const char*也就是常量指针所以是不能用a="test str!"

    57920

    【面试题精讲】Java字符型常量和字符串常量的区别?

    ★ 有的时候博客内容会有变动,首发博客是最新的,其他博客地址可能会未同步,认准https://blog.zysicyj.top ” Java 中的字符型常量和字符串常量是两种不同的数据类型。...字符型常量:字符型常量是由单个字符组成的,用单引号括起来。例如:'A', 'b', '1'等。在内存中,字符型常量被表示为对应的 Unicode 编码值。...字符串常量:字符串常量是由多个字符组成的,用双引号括起来。例如:"Hello", "World"等。在内存中,字符串常量以字符数组的形式存在,并且每个字符都有一个对应的 Unicode 编码值。...长度不同:字符型常量只能包含一个字符,而字符串常量可以包含任意数量的字符。 内存表示不同:字符型常量在内存中占用 2 个字节,字符串常量在内存中以字符数组的形式存在。...(result); // 输出:Hello World 总结: 字符型常量和字符串常量在 Java 中是两种不同的数据类型,分别用于表示单个字符和多个字符组成的字符串。

    20960

    【答疑解惑】常量字符串引发的“血案”

    要正确理解这个问题,需要了解C语言中变量及常量的存储位置,这个其实在咱们程序员互动联盟里面以前的文章中应该也讲到过,一直阅读和关心的朋友应该看到过。...本身是一个栈中的变量,但它们指向的字符串都放在代码段中,是一个只读的内存块,所以这种情况下,要用第二个字符串去逐个替换时,操作系统会检查到目标内存是一个只读属性的存储单元,会给程序返回一个异常,于是我们就看到下面这个出错的对话框了...对于第二中方式,在编译的时候,同样会把两个字符串放到某个只读区。...但是关键点来了,s1和s2是数组,他们的内存空间也是分配在栈中的,由于这两个变量在分配时同时需要用常量初始化的,所以在变量空间在栈中分配好后,编译器会做额外的工作,它会自动把那个只读的字符串拷贝过来初始化这个栈中的变量...如果要对以上做更深入的理解,你需要知道进程的虚拟内存以及物理存储映射相关的知识。对于初学者,只要知道C语言中字符常量编译在只读区,不能写即可。

    73570
    领券