字符串在内存中的存储——C语言进阶
字符串是以ASCII字符NUL结尾的字符序列。
ASCII字符NUL表示为\0.字符串通常存储在数组或者从堆上分配的内存中。只是,并不是全部的字符数组都是字符串,字符数组可能没有NUL字符。
字符数组也用来表示布尔值等小的整数单元,以节省内存空间。
C中有两种类型的字符串:
单字节字符串
由char数据类型组成的序列
宽字符串
由wchar_t数据类型组成的序列
wchar_t数据类型用来表示宽字符,要么是16位宽。要么是32位宽。这两种字符串都以NUL结尾。能够在string.h中找到单字节字符串函数。而在wchar.h中找到宽字符串函数。宽字符主要用于非拉丁字符集,对于支持外语的应用程序非常实用,
字符串的长度是字符串中除了NUL字符外的字符数。为字符串分配内存的时候,要记住为全部的字符加上NUL字符分配足够的空间。
NULL和NUL不一样。NULL用来表示特殊的指针,通常定义为((void*)0)。而NUL是一个char,定义为\0,两者不能混用!
字符常量是单引號引起来的字符序列。
字符常量通常由一个字符组成。也能够包括多个字符,比方转义字符。
在C中,它们的类型是int,例如以下所看到的:
printf("%d\n",sizeof(char));
printf("%d\n",sizeof('A')); //output
//1
//4
字符串声明
声明字符串的方法有三种:字面量,字符数组。和字符指针。
字符串字面量是用双引號引起来的字符序列,经常使用来进行初始化,他们位于字符串字面量池中。<span style="color:#ff0000;">这和单引號引起来的字符不一样!</span>
以下是一个字符数组的样例:
char header[32];
以下是字符指针:
char *header;
字符串字面量池
定义字符量一般会将其分配到字面量池中。这个内存区域保存了组成字符串的字符序列。
多次会用到同一个字面量时,字面量池一般会仅仅有一个副本。这样能够降低应用程序占用的内存。
通常觉得字面量是不可变的,因此仅仅有一份副本不会有什么问题。
字符串字面量一般分配在仅仅读区域中,所以是不可变的。字符串字面量在哪里使用。或者他是全局,静态或者局部都无所谓,从这个角度讲。字符串字面量不存在作用域的概念。
在大部分编译器中。我们将字符串字面量看做常量。无法改动字符串。
可是GCC编译器容许字符串字面量能够改动。
char *header = "Sound";
*header = 'L';
printf("%s\n",header); //output
//Lound
这样就会改变字符串,不是我们预期的结果。因此应该避免这样做。像以下这样把变量声明为常量能够解决一部分问题。不论什么改动都会造成编译时错误:
const char *header = "Sound";
字符串初始化
初始化字符串採用的方法取决于变量是被声明为字符数组还是字符指针,字符串所用的内存要么是指针指向的一块内存。我们都能够用字符串字面量或者一些列字符初始化字符串,或者从别的地方(标准输入)得到字符。
初始化char数组
我们能够用初始化操作符初始化char数组。在下例中。header数组被初始化为字符串字面量中所包括的字符:
char header[] = "Media Player";
字符量"Media Player"的长度为12,表示这个字面量须要13个字节,我们就要为数组分配13个字节来持有字符串。初始化操作会把这些字符拷贝到数组中,以NUL结尾。
我们也能够用strcpy函数来初始化数组。
初始化char指针
用动态内存分配来初始化char指针。
char *header;
char *header = (char*)malloc(strlen("Media Player")+1);
注意不要用sizeof操作符,而要用strlen函数来确定已有字符串的长度,sizeo操作符会返回数组和指针的长度,而不是字符串的长度。
字符串在内存中的存储——C语言进阶的更多相关文章
- String在内存中如何存储(Java)
JDK1.8中JVM把String常量池移入了堆中,同时取消了“永久代”,改用元空间代替(Metaspace)java中对String对象特殊对待,所以在heap区域分成了两块,一块是字符串常量池(S ...
- C语言之数据在内存中的存储
C语言之数据在内存中的存储 在我们学习此之前,我们先来回忆一下C语言中都有哪些数据类型呢? 首先我们来看看C语言中的基本的内置类型: char //字符数据类型 short //短整型 int //整 ...
- QList介绍(QList比QVector更快,这是由它们在内存中的存储方式决定的。QStringList是在QList的基础上针对字符串提供额外的函数。at()操作比操作符[]更快,因为它不需要深度复制)非常实用
FROM:http://apps.hi.baidu.com/share/detail/33517814 今天做项目时,需要用到QList来存储一组点.为此,我对QList类的说明进行了如下翻译. QL ...
- 【C语言】整型在内存中的存储
整型在内存中的存储 1.整型的归类 char short int long 以上都分为有符号(signed)与无符号(unsigned)的类型 2.原码.反码和补码 2.1 定义 计算机在表示一个数字 ...
- 【C语言】浮点型在内存中的存储
1. 摘要 在了解到C语言中整型是以二进制补码形式存储在内存中后,我们不禁很好奇:那么浮点型的数据是以什么形式存储在内存中的呢? 实际上,早在1985年,电气电子工程师学会就制定了IEEE 754标准 ...
- C语言中浮点数在内存中的存储方式
关于多字节数据类型在内存中的存储问题 //////////////////////////////////////////////////////////////// int ,short 各自是4. ...
- 数据在内存中的存储方式( Big Endian和Little Endian的区别 )(x86系列则采用little endian方式存储数据)
https://www.cnblogs.com/renyuan/archive/2013/05/26/3099766.html 1.故事的起源 “endian”这个词出自<格列佛游记>.小 ...
- 一个 -100.01 的double 在内存中怎么存储的. 一个中文String 在内存中占多少直接 utf-8 / GBK
一.-100.01 的double 在内存中怎么存储的 double双精度数据类型存储格式IEEE 双精度格式为8字节64位,由三个字段组成:52 位小数 f : 11 位偏置指数 e :以及 1 位 ...
- float 在内存中如何存储的
float类型数字在计算机中用4个字节存储.遵循IEEE-754格式标准: 一个浮点数有2部分组成:底数m和指数e 底数部分 使用二进制数来表示此浮点数的实际值指数部分 占用8bit的二进制数, ...
随机推荐
- 2018 ACM-ICPC 青岛网络赛
最近打比赛不知道为什么总是怀疑自己 写完之后不敢交,一定跟学长说一遍自己的思路 然后发现"哦原来我是对的" 然后就A掉了…… 所以还是要有自信 Problem A 最大值直接输出m ...
- 洛谷P3943星空
啦啦啦啦——又是五月天的歌,题目传送门 这道题比之前两道真的不是同一级别的,这里我这个蒟蒻也讲不清,不如看下这位大佬的吧,他的写的已经非常清楚了:Z-Y-Y-S,这里我就只放下我的代码,也是按照这位大 ...
- Bzoj1101 Zap(莫比乌斯反演)
题面 Bzoj 题解 先化式子 $$ \sum_{x=1}^a\sum_{y=1}^b\mathbf f[gcd(x,y)==d] \\ = \sum_{x=1}^a\sum_{y=1}^b\sum_ ...
- 第八届山东省ACM大学生程序设计竞赛个人总结
因为省赛,从开学紧张到5月7号.心思也几乎全放在ACM的训练上.因为我还是校台球协会的会长,所以台协还有一些事情需要忙,但是我都给延迟了.老会长一直在催我办校赛,但我一直说 等等吧,因为校赛只能在周六 ...
- .Net中DataGridview数据如何导出到excel表
首先,这个问题在网上有很多答案,也有很多解决的方法.其次,很多人写过类似的博客 .我的这篇博客,主要是写给那些刚刚接触或接触不久.NET并使用其做程序的人,更是写个自己,记录一下方法,方便以后使用. ...
- [BZOJ1913][APIO2010]信号覆盖(计算几何+计数)
1913: [Apio2010]signaling 信号覆盖 Time Limit: 20 Sec Memory Limit: 64 MBSubmit: 1658 Solved: 672[Subm ...
- [BZOJ 3140] 消毒
Link: BZOJ 3140 传送门 Solution: 挺好的一道暴力题 首先发现可以每次贪心选择宽度为1的一面,即$1*x*y,1*x*z,1*y*z$ 那么对于与该面垂直的面,相当于解决了一行 ...
- 【置换群/模拟】NOIP2005-篝火晚会
[问题描述] 佳佳刚进高中,在军训的时候,由于佳佳吃苦耐劳,很快得到了教官的赏识,成为了“小教官”.在军训结束的那天晚上,佳佳被命令组织同学们进行篝火晚会.一共有n个同学,编号从1到n.一开始,同学们 ...
- boost_1.63.0编译VS2013
编译 boost 库的步骤: 从官网下载最新版本的 boost 库(目前最新版本为:boost_1_63_0):下载地址:http://www.boost.org/users/download/ 解压 ...
- 一段javascript设计模式应用场景
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <hea ...