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

字符串的三种存储方式

在数据结构中,字符串要单独用一种存储结构来存储,称为串存储结构。这里的串指的就是字符串。无论学习哪种编程语言,操作最多的总是字符串。我们平常使用最多的存储结构无疑是利用定长数组存储。...例如,采用定长顺序存储结构存储 “feizhufeifei”,通过目测得知此字符串长度为12(不包含结束符 ‘\0’),因此我们申请的数组空间长度至少为 12,用 C 语言表示为: char str[18...下面介绍第二种存储方式。 动态数组存储   首先我们应该明确两个概念:堆和栈。   ...除此之外,在函数被调用时,其参数也会被压入发起调用的进程栈中,并且待到调用结束后,函数的返回值也会被存放回栈中,由于栈的先进后出特点,所以栈特别方便用来保存、恢复调用现场。...str = (char*)realloc(str, 20*sizeof(char));   下面通过一个合并两个字符串的例子来更好地理解下动态分配过程。

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

    redis SDS设计与实现分析

    []; } 现在还有一个问题没有讨论:拿到一个sds对象,怎么判断它是哪种类型呢?...c语言中是没有字符串类型的,像高级语言Go中有string类型。c语言中存储字符串,有两种存储方式。但本质是一块连续的内存空间,依次存放了字符串中每个字符。...存储方式1:使用字符串数组,将字符串中每个字符存储到数组中,并在末尾添加\0,如下面代码中的s2。 存储方式2:使用字符指针,将一个字符串赋值给字符指针,如下面代码中的s1。...1 创建SDS 根据c语言字符串init创建SDS,内部调用sdsnewlen进行初始化,暴露给使用者只需提供一个c字符串,不需要传递大小,可以通过strlen函数求解。...2 SDS怎么做到兼容c语言字符串 在定义SDS结构体时,将存储字符串的buf放在最后,使其成为一个柔性数组,在上层调用时,直接返回buf而不是SDS结构体。

    35710

    串是什么,串存储结构的3种实现方法

    无论学习哪种编程语言,操作最多的总是字符串。...另外,对于具有主串和子串关系的两个串,通常会让你用算法找到子串在主串的位置。子串在主串中的位置,指的是子串首个字符在主串中的位置。...(顺序表)的底层实现用的是数组,根据创建方式的不同,数组又可分为静态数组和动态数组,因此顺序存储结构的具体实现其实有两种方式。...我们知道,单链表中的 "单" 强调的仅仅是链表各个节点只能有一个指针,并没有限制数据域中存储数据的具体个数。因此在设计链表节点的结构时,可以令各节点存储多个数据。...这里给出一个实现串的块链存储的 C 语言程序,以加深初学者对此字符串存储方式的认识: #include #include #include #define

    10510

    【C++修炼之路】7. 模板初阶

    代码的可维护性比较低,一个出错可能所有的重载均出错 因此,为了防止并优化以上情况,我们引入了泛型的函数模板 如果在C++中,也能够存在这样一个模具,通过给这个模具中填充不同材料(类型),来获得不同材料的铸件...y); return 0; } 通过template就可以将T设置成泛型,即传入哪种参数就可以变为哪种参数。...: 即两种函数调用都是该函数的机器指令被存放在代码段中,对于函数模板来说:我们使用相同类型的参数多次调用同一模板函数时,也只会实例化一个模板。...但是这样的方式过于麻烦,即我们需要的是在函数模板本身进行修改,而不是为了编译成功而修改传入参数的类型。...对于类模板来说,必须实例化才能在定义时去推演指定的类,如果不在初始化时推演就会报错: 这是因为在初始化时会自动调用构造函数的初始化列表,因此在初始化我们就必须明确具体类型,否则无法进行初始化。

    35900

    用 C++ 和 Java 写算法,有差别吗?

    所以在本文里,我非常详细的讲述了用 Java 或 C++ 写算法时候的优劣势,你可以参考一下来判断自己喜欢用哪种语言写算法。...我通常这样理解:Java 是跨平台的 C++,是一种更好的 C++(是不是有点拉仇恨的感觉)。...C++ 中定义数组的同时就分配了存储空间,所以在定义时要指定长度,使用 new 动态申请内存时,要指定长度。...但是一种情况除外,那就是静态初始化数组的形式,因为此时编译器知道需要多少空间存储这些数据,如下是 C++ 定义数组的常用形式: ?...但是二者在使用形式上是一样的。C++ 定义和初始化二维数组一般有这几种形式: ? 与之对应的 Java 语言初始化二维数组的形式是: ?

    2.4K10

    关于我、重生到500年前凭借C语言改变世界科技vlog.13——深入理解指针(3)

    "; printf("%s\n", pstr); return 0; } 乍一看是存放字符串在指针变量中,但我们要记住指针变量是用来存放地址的 所以这里本质是把字符串 hello bit....实际上,在这种情况下,解引用操作符 * 在这里是可选的,因为在 C 语言中,函数名本身在求值时就会转换为指向该函数的指针,所以也可以直接写成 pf3(2, 3) 4.函数指针数组 在学习了指针数组的基础上...,我们引入函数指针放入数组 那么以下哪种为正确的形式?...func_array 数组的两个元素分别被初始化为 add 函数和 subtract 函数的指针 5.二维数组传参本质 讲数组的时候说过二维数组其实可以看做是每个元素是一维数组的数组,也就是二维数组的每个元素是一个一维数组...虽然解引用通常是获取元素本身,但在指向二维数组行的指针这种特殊情况下,由于指针所指向的对象本身就是一个数组,解引用得到的就是这个数组的首地址,这是由 C 语言的指针和数组特性共同决定的 二维数组传参

    3600

    C++与C的区别终于说清楚了!

    例如,考虑下面的语句: char ch = 'A'; 在C中,常量'A'被储存在int大小的内存块中,更精确地说,字符编码被储存为一个int类型的值。...];相同 */ 当然,也可以在C99中使用相同的声明,不过这样的声明会创建一个变长数组。...在C++中,可以使用const值来初始化其他const变量,但是在C中不能这样做: const double RATE = 0.06; // C++和C都可以 const double...下面列出了一些只有C99/C11中才有的特性: 指定初始化器; 受限指针(Restricted pointer) (即,restric指针); 变长数组; 伸缩型数组成员; 带可变数量参数的宏。...本书采用了友好、易于使用的编排方式,不仅适合打算认真学习C语言编程的学生阅读,也适合那些精通其他编程语言,但希望更好地掌握C语言这门核心语言的开发人员阅读。

    90110

    Objective-C中的语法糖

    写这篇博客源于一个疑问:“WoK~, 这也行?!”。刚接触OC不久,今天做深浅拷贝的测试,无意中把获取NSArray的值写成了用下标获取的方式。...当时把注意力放在了深浅拷贝的内存地址分析上了,就没太在意,测试做完啦,在回顾的时候发现数组是用下标的方式获取的! 于是就有了个疑问,在OC中这样写也行?...不是NSArray中有一个方法叫做objectAtIndex来专门获取数组的元素嘛,嗯~用下标也行?此时心里窃喜,可以简化一下数组访问元素的方式了,又可以偷懒啦!!...ludashi~走起~(虽然是12年的东西,这不刚学蛮~在OC中用感觉挺新鲜的,简化后对字典的初始化感觉和PHP有点相似~感觉见到亲人啦~)   问题是数组引起的那么就从数组开始吧   1.一般数组的初始化和访问数组元素是这样的...    在之前的博客中我是这样初始化NSArray的: 1 //NSArray的便利初始化 2 NSArray *array1 = [[NSArray alloc] initWithObjects:@

    1K50

    【C语言】指针进阶

    一、指针变量 指针变量有字符指针变量,数组指针变量和函数指针变量 1、字符指针变量 char* 叫做字符指针 一般这么来使用:通过指针存储指针后解引用访问 int main() { char c =...'a'; char* p = &c; *p = 'a'; return 0; } 另一种使用方式: 将字符串首字符h的地址放入pstr指针当中 int main() { const char...但是用相同的常量字符串去初始化不同的数组的时候就会开辟出不同的内存块。...: int* p[5]; 这样p会与 [ ] 率先结合,这样p就不是一个数组指针变量了 ②数组指针变量的初始化 int arr[10] = {0}; int(*p)[10] = &arr; 用数组地址来初始化...= 10; printf("%d", c); return 0; } 一个挺有意思的关键字,在以后工作和学习中,我们可以早早定义好比较常用的类型,提高工作效率 但是在其使用时,数组指针和函数指针的重命名和上述方法有一些不同

    7410

    C语言——简易版扫雷

    这样就互不⼲扰了,把雷布置到 mine数组,在mine数组中排查雷,排查出的数据存放在show数组,并且打印show数组的信息给后期 排查参考。...组织性好:将代码划分到不同的文件中,可以更好地组织和管理代码。每个文件可以分别负责不同的功能模块,使代码结构更清晰。 2. 可维护性强:多文件的编程方式使得修改或更新某个功能模块变得更加简单。...在这个扫雷中我们需要: game.h ⽂件中写游戏需要的数据类型和函数声明等 game.c ⽂件中写游戏中函数的实现等 text.c ⽂件中写游戏的测试逻辑...(game.c) 对数组mine和show进行初始化,将mine的数组全部初始化为‘0’,show初始化为‘*’。...如果只是简单的在数组中初始化化‘0’,‘*’。我们传入应该char set就能够让代码更加灵活,不用在写一样的代码浪费时间和空间。

    10710

    【C语言】结构体与共用体深入解析

    在C语言中,结构体(struct)和共用体(union)都是用来存储不同类型数据的复合数据类型,它们在程序设计中具有重要的作用。1....结构体变量的声明方式如下:struct StructName varName;结构体的初始化可以通过两种方式进行:静态初始化和动态初始化。1.2.1 静态初始化静态初始化是在定义结构体变量时直接赋值。...声明结构体数组的方式与普通数组类似。...例如,我们可以在结构体中包含一个共用体,或者在共用体中使用结构体。...通过本篇文章的学习,希望你能够全面理解结构体与共用体的定义、使用方式及其在指针方面的应用,从而更好地应对C语言编程中的复杂问题。

    12210

    指针的艺术——指针是什么?

    指针是C/C++中非常非常重要的概念,指针可以用于存储内存地址,动态分配内存等。在项目开发中应用比较频繁,可以简化一些程序任务的执行。学会使用指针是作为C++程序猿必备的技能。...声明格式如下: type *var_name; type:指针基类型,C/C++的数据类型,如:int、char、double、float 等,但是不管数据类型是哪种,其指针值都是代表一个内存地址。...避免产生野指针的方法:在指针所指地址被释放内存后,将指针设置为nullptr。 悬空指针 (Uninitialized Pointer) 悬空指针是未被初始化的指针,指向一个随机的内存地址。...如果使用一个未初始化的指针,可能导致未定义行为。 建议在声明指针时对指针进行初始化,指向 nullptr。示例参考空指针代码。...在多级间接寻址的方案中,常用于动态分配二维数组,通过双重指针实现二维数组。

    7510

    C++异常处理建议收藏

    大家好,又见面了,我是全栈君 一 C++异常处理机制   异常处理基本思想:执行一个函数的过程中发现异常,可以不用再本函数内立即进行处理,而是抛出该异常,让函数的调用者直接或间接的处理这个问题。   ...,则catch里面捕获哪种类型的异常,一般情况下,类型必须完全匹配,但以下三种情况可以进行类型转换:   (1)运行从非const对象到const对象转换,即throw一个非const对象,catch一个...const对象   (2)运行从派生类类型到基类型的转换   (3)将数组转换为数组类型的指针,函数转换为指向函数类型的指针 #include bool Equal(double num1...void f() throw(); // 这意味函数不会抛出异常   (2) 保证不在构造函数中抛出异常,因为构造函数的作用是构造对象并初始化,一旦抛出异常,有可能导致对象不完整或没有完全初始化...设计异常处理的重要目标之一是:在异常处理实现中,当异常不发生时应不影响运行速度,这就是说,只要不抛出异常,代码的允许速度如同没有加载异常处理一样,无论与否,异常处理都依赖于使用的特定编译器,异常处理会引出额外信息

    45710

    Java基础(八)| 常用API与StringBuilder详解

    [] chs):根据字符数组的内容,来创建字符串对象 char[] chs = {'a', 'b', 'c'}; String s2 = new String(chs);...char[]chs = { 'a', 'b', 'c'}; string s1 = new string(chs); string s2= new string (chs); 上面的代码中,JVM会首先创建一个字符数组...直接赋值方式创建 ​ 以“”方式给出的字符串,只要字符序列相同(顺序和大小写),无论在程序代码中出现几次,JVM 都只会建立一个 String 对象,并在字符串池中维护。...例如,数组为 int[] arr = {1,2,3}; ,执行方法后的输出结果为:[1, 2, 3] 2.9.2代码实现 /* 思路: 1:定义一个 int 类型的数组,用静态初始化完成数组元素的初始化...例如,数组为int[] arr = {1,2,3}; ,执行方法后的输出结果为:[1, 2, 3] 3.6.2代码实现 /* 思路: 1:定义一个 int 类型的数组,用静态初始化完成数组元素的初始化

    28520

    动态规划法(三)——最长公共子序列

    如:序列X={a,b,c,b,d,a,b},Y={b,d,c,a,b,a},则X和Y的最长公共子序列为{b,c,b,a} 子序列:子序列为原序列的一个子集,并不要求连续,但要求子序列中元素的顺序和原序列元素的顺序一致...s[i][j]: 用来标识Xi和Yi的最长公共子序列是由哪种情况得来:c[i][j-1]、c[i-1][j]、c[i][j]+1。 该数组能还原出最长公共子序列。 算法思路 1....生成c数组和s数组所有元素 将c数组的第0行、第0列初始化为0; 从c数组的第一行、第一列开始,依次从左向右、从上到下填充元素值: a)若x[i]==y[j],则c[i][j]=c[i-1][j-1...生成c数组和s数组所有元素 void LCSLength(String a, String b){ // x和y的最前端分别加上0 char[] x = ("0"+a).toCharArray...当c和s都填充完毕后,就可以根据s数组找到最长公共子序列 从s数组最右下角的元素开始: a)若s[i][j]==1,则找到一个字符,并继续比较左上角的元素; b)若s[i][j]==2,则继续比较上方的元素

    1.1K40

    Java学习笔记之常用API String类 StringBuilder类

    2.2 String类的特点 字符串不可变,它们的值在创建后不能被改变 虽然String的值是不可变的,但是它们可以被共享 字符串效果上相当于字符数组(char[]),但是底层原理是字节数组(byte[...[] chs) : 根据字符数组的内容,来创建字符串对象 char[] chs = {'a', 'b', 'c'}; String s2 = new String(chs...通过构造方法创建 通过new创建字符串对象,每一次new都会申请一个内存空间,虽然内容相同,但是地址值不同 直接赋值方式创建 以“”方式给出的字符串,只要字符序列相同(顺序和大小写),无论在程序代码中出现几次...com.StringTest; /* 思路: 1 定义一个int类型的数组,用静态初始化完成数组元素的初始化 2 定义一个方法,用于吧int数组中的数据按照指定格式拼接成一个字符串返回...com.StringBuilder; /* 思路: 1 定义一个int类型的数组,用静态初始化完成数组元素的初始化 2 定义一个方法,用于把int数组中的数据按照指定格式拼接成一个字符串返回

    39310

    Redis源码剖析之SDS(Simple Dynamic String)

    在开始正式内容前,我先抛几个问题(有些也是面试高频题),带着问题去学习也是一种非常好的学习方法。 C语言中也算是支持String了,为什么Redis还要自己封装一个?...从sds初始化方法sdsnew和sdsnewlen中我们就可以看出,redis在新建sds时需要传如初始化长度,然后根据初始化的长度确定用哪种sdshdr,小于2^8长度的用sdshdr8,这样len和...sdsnewlen的代码就非常好懂了,如下: sds sdsnewlen(const void *init, size_t initlen) { void *sh; sds s; // 根据初始化的长度确定用哪种...,Redis也不例外,Redis在10241024以内都是2倍的方式扩容,只要不超出10241024都是先额外申请200%的空间,但一旦总长度超过10241024字节,那每次最多只会扩容10241024...(sds s, const char *cset); // 在sds中移除开头或者末尾在cset中的字符 void sdsrange(sds s, ssize_t start, ssize_t end

    50120

    EasyC++10,字符串初体验

    这是EasyC++系列第10篇,我们来聊聊C++中的字符串。 字符串 字符串定义 字符串就是连续的一连串字符,在C++当中, 处理字符串的方式有两种类型。一种来自于C语言,也被称为C风格字符串。...C风格的字符串其实就是字符存储在char数组当中。不过它和一般的数组有一些区别,拥有一些特殊的性质。比如一空字符\0结尾,它的ascii码是0,用来标记字符串的结尾。...上面我们采用的是数组常规的初始化方式,这当然是可以的,不过这样会很不方便。一个是需要一位一位地填写字符,会非常地麻烦。...另外还需要手动填充\0,也容易忘记,所以对于字符串而言我们还有更好的初始化方式: char hello[6] = "hello"; char world[] = "world"; 用引号括起来的字符串隐式地包含了结尾的...字符串的读入 直接用字符串常量来初始化字符数组只是一种方式,另外一种常用的方式是只定义字符数组的长度,从外部读入数据,如: char str[100]; scanf("%s", str); cin >

    67520
    领券