指针数组

重学C语言之结构体

我与影子孤独终老i 提交于 2019-11-29 02:57:11
概念 结构体是一种构造类型,由若干个成员组成,成员可以是基本数据类型,或是另一个结构体 声明结构体 struct 结构体名 { 成员列表 }; 结构体名表示结构的类型名。 声明一个结构体表示创建一种新的类型名(自定义数据类型),然后用类型名定义变量。 struct Product { char name[10]; char shape[10]; char color[10]; float price; } 使用结构体定义变量有三种方式 第一种:声明结构体类型,再定义变量 struct Product p1; struct Product p2; p1和p2是结构体变量名,这两个变量具有相同的结构 类比: 类型名 变量名 int a; | | struct Product p; struct Product整体表示一种数据类型 定义结构体变量后,系统会为其分配内存单元 第二种:声明结构体类型时,同时定义变量(可以定义多个变量) struct 结构体名 { 成员列表 } 变量名列表; example: struct Product { char name[10]; char shape[10]; char color[10]; float price; } p1, p2; 第三种:直接定义结构体类型变量(匿名结构体,没有结构体名称) struct { 成员列表 } 成员变量;

C++ 指针与二维(多维)数组

假装没事ソ 提交于 2019-11-29 01:46:45
在 上一章 中, 介绍了指针与一维数组的联系 (指针数组叫 动态数组 ) 一维数组搞定了, 二维数组 ? 能否 按照一维数组的思路 ?------可以 例: #include <iostream> using namespace std; int main() { int num[3][3]; for(int i=0;i<3;i++) for(int j=0;j<3;j++) cin>>num[i][j]; for(int i=0;i<3;i++) { for(int j=0;j<3;j++) cout<<num[i][j]<<' '; cout<<endl; } return 0; } 其内存状态如下, 看不懂看 这里 : 现在问题是, 出现了3个指针, 如何将其融合于一个指针之中呢? 其实上想一想就知道, 就是双重指针 ( ** ) 好, 现在我们已经有了一个申请 列 的空间的雏形: #include <iostream> using namespace std; int main() { int **num=new int*[3];//申请3个指针空间(给列用, 3个列) return 0; } 现在内存状态如下: 现在问题又来了: 如何 申请行的空间 ? 这也不难, 想一下, num[0], num[1], num[2] 都是指针, 而指针怎么再开辟空间, 不是又回到了

字符串与指针

天涯浪子 提交于 2019-11-28 20:53:09
字符串与指针 1、字符串的表示形式: 数组形式: char string[] = “hello world"; //栈(局部) 字符指针形式: char *str = “hello world"; //文字常量区 数组形式与字符指针形式都是字符串的表示形式,但是这两种表示形式大不相同。 下面以数字形式字符串char string[] = “hello world"; 与指针形式字符串char *str = "hello world";为例: 1、储存方式: (1)字符数组由若干元素组成,每个元素存放一个字符, (2)而字符指针变量只存放字符串的首地址,不是整个字符串。 2、存储位置: (1)数组是在内存中开辟了一段空间存放字符串; (2)而字符指针是在文字常量区开辟了一段空间存放字符串,将字符串的首地址付给指针变量str。 3、赋值方式: 对与数组,下面的赋值方式是错误的: char str[10]; str="hello"; 而对字符指针变量,可以采用下面方法赋值: char *a; a="hello"; 4、可否被修改: (1)指针变量指向的字符串内容不能被修改,但指针变量的值(即存放的地址或者指向)是可以被修改的; 例一:指针变量指向的字符串内容不能被修改 char *p = "hello"; //字符指针指向字符串常量 *p = 'a'; //错误,常量不能被修改

猎豹网校C++ Primer学习笔记2

江枫思渺然 提交于 2019-11-28 19:06:52
14、数组 数组定义时的 长度 必须是在编译时就能确定的值。 全局数组会自动初始化为0。 size_t 15、指针 其指向类型要相同。 指针和引用: 指针可以先不初始化,可以修改指向。有指针的指针。 16、使用指针访问数组 指针的减法: 指针的下标是在运算: 两种循环写法: 对比迭代器: 17、const+指针 指向常对象的指针 不可以通过指针修改其值。 18、C风格字符串-字符常量数组 一个个字符构成数组,末尾补‘\0’。 要#include<cstring>;使用strlen。 比较大小:要用strcmp。 拷贝、连接: 使用带n的函数:个数。 要初始化! 19、创建动态数组 根据需要动态修改长度。静态数组在堆栈上,动态数组在堆上。 来源: https://www.cnblogs.com/wxl845235800/p/11421693.html

Vector使用

前提是你 提交于 2019-11-28 18:18:14
https://www.cnblogs.com/linuxAndMcu/p/10259630.html 一、vector介绍: vector(向量): 是一种序列式容器,事实上和数组差不多,但它比数组更优越。一般来说数组不能动态拓展,因此在程序运行的时候不是浪费内存,就是造成越界。而vector正好弥补了这个缺陷,它的特征是相当于可分配拓展的数组(动态数组),它的随机访问快,在中间插入和删除慢,但在末端插入和删除快。 回到顶部 二、用法 1、头文件 #include <vector> //vector属于std命名域的,因此需要通过命名限定,例如using std::vector; 2、定义及初始化 vector<int> a; //定义一个int类型的向量a vector<int> a(10); //定义一个int类型的向量a,并设置初始大小为10 vector<int> a(10, 1); //定义一个int类型的向量a,并设置初始大小为10且初始值都为1 vector<int> b(a); //定义并用向量a初始化向量b vector<int> b(a.begin(), a.begin()+3); //将a向量中从第0个到第2个(共3个)作为向量b的初始值 除此之外,还可以直接使用数组来初始化向量: int n[] = {1, 2, 3, 4, 5} ; vector<int

【飞秋】关于结构体和结构体指针的P-INVOKE

白昼怎懂夜的黑 提交于 2019-11-28 18:02:20
这篇讲关于结构体和结构体指针的P-INVOKE,关键有4个P-INVOKE类型,结构体作为输入输出参数。结构体指针作为输入输出参数。还有结构体内的成员类型分为:数组,指针,指针数组,结构体,结构体指针,结构体数组,结构体指针数组。当然还有类继承(这里只介绍了单继承)。 其中有一个比较费解的是结构体作为返回值的P-INVOKE的奇怪现象,下一篇结合反汇编讲解。 即时通讯软件 第一:C++结构体和C#结构体对应关系,看下面。这里提到一点C# 声明结构体中的成员是数组的必须像下面那样声明:使用[MarshalAs(UnmanagedType.ByValArray, SizeConst = N)] C++代码不多,全部贴到这里: 1 struct Base 2 { 3 int BaseInt; 4 }; 5 6 struct Test : Base 来源: oschina 链接: https://my.oschina.net/u/15186/blog/6989

redis的数据结构与对象

倾然丶 夕夏残阳落幕 提交于 2019-11-28 17:57:24
  地方简单动态字符串   redis没有直接使用C语言传统的字符串表示(以空字符结尾的字符数组),而是自己构建了一种名为简单动态字符串(simple dynamic string sds)的抽象类型,并将sds作为redis的默认字符串表示。    在redis中,c字符串只会作为字符串字面量用在一些无须对字符串值进行修改的地方 。比如打印日志:   redisLog(REDIS_WRNING,"redis is now ready to exit,bye bye");    如果redis需要的是一个可以被修改的字符串,那么就会使用sds来表示字符串的值 ,比如,如果在客户端执行命令,msg 和 hello word都将会用sds来表示。   redis> set msg "hello word"   OK   除了用来保存数据库中的字符串值之外,sds还被用作缓冲区:AOF模块中的AOF缓冲区。    1.sds定义   每个sds.h/sdshdr结构表示一个sds值:      sds遵循了c字符串以空字符结尾的惯例,保存空字符的1字节空间不计算到len属性中。为空字符串分配额外的1字节空间,以及将空字符串添加到字符数组的末尾都是由sds函数自动完成的,所以空字符串对于sds的使用者来说是完全透明的。 遵循了c字符串以空字符结尾的惯例的好处是

链表

妖精的绣舞 提交于 2019-11-28 13:02:27
开篇问题 问题:如何用链表来实现 LRU 缓存淘汰策略呢? 链表的作用 链表一个经典的应用场景就是 LRU 缓存淘汰算法; 缓存是一种提高数据读取性能的技术,在开发中有着非常广泛的应用,由于缓存的大小有限,当缓存被占满时,哪些数据应该被清理,哪些数据应该被保留?这就需要淘汰策略来决定,常见的淘汰策略有三种:先进先出策略FIFO(First In, First Out)、最少使用策略LFU(Least Frequently Used)、最近最少使用策略LRU(Least Recently Used)。 打个比方:假如说你买了很多书籍,但有一天发现书太多了,太占空间,你要做个大扫除。那么这个时候你会选择扔掉哪些书籍?对应一下,其实就是我们上边说的三种策略; 什么是链表? 为了理解起来更容易,我们拿数组来做对比; 相比数组,链表是一种稍微复杂一点的数据结构。从底层的存储结构上来看:数组需要一块儿连续的内存空间,堆内存的要求比较高,如果我们申请一个100MB大小的数组,当内存中没有连续的、足够大的空间的时候,即便内存的剩余总可用空间大于100MB,仍然会申请失败;而链表恰恰相反,它并不需要一块儿连续的内存空间,它通过“指针”将一组零散的内存块串联起来,所以如果我们申请100MB大小的链表,如果没有100MB连续的内存空间,且内存的剩余总可用空间大于100MB,根本不会有问题;

C++内存详解[精]

你离开我真会死。 提交于 2019-11-28 12:53:15
伟大的Bill Gates 曾经失言:   640K ought to be enough for everybody — Bill Gates 1981   程序员们经常编写内存管理程序,往往提心吊胆。如果不想触雷,唯一的解决办法就是发现所有潜伏的地雷并且排除它们,躲是躲不了的。本文的内容比一般教科书的要深入得多,读者需细心阅读,做到真正地通晓内存管理。   1、内存分配方式   内存分配方式有三种:    (1) 从静态存储区域分配 。内存在程序编译的时候就已经分配好, 这块内存在程序的整个运行期间都存在 。例如全局变量,static变量。   (2) 在栈上创建 。在执行函数时,函 数内局部变量的存储单元都可以在栈上创建,函数 执行结束时这些存储单元自动被释放 。栈内存分配运算 内置于 处理器的指令集中,效率很高 ,但是分配的内存 容量有限 。   (3) 从堆上分配 ,亦称 动态内存分配。程序在运行的时候用malloc或new申请任意多少的内存 ,程序员自己负责在何时用free或delete释放内存。动态内存的生存期由我们决定,使用非常灵活,但问题也最多。   2、常见的内存错误及其对策   发生内存错误是件非常麻烦的事情。编译器不能自动发现这些错误,通常是在程序运行时才能捕捉到。而这些错误大多没有明显的症状,时隐时现,增加了改错的难度。有时用户怒气冲冲地把你找来

数据结构-线性表

前提是你 提交于 2019-11-28 12:14:02
将线性表分为几个模块来学习: 1.单链表头插法建表 2.单链表尾插法建表 3.归并 4.划分 5.逆置 6.顺序表建表 7.顺序表删除 8.顺序表添加 9.最值问题 10.真题演练 ----------------------------------------------------------------------------------------------- 1.单链表头插法建表: 1 /单链表头插法建表 2 3 /* 4 #inlclude<iostream> 5 using namespace std ; 6 7 void createLinkListH (Node *&head) 8 { 9 head = (*LNode)malloc(sizeof(LNode)); 10 head->next = NULL ; 11 Node *p = NULL; 12 int n ; 13 cin >> n ; 14 for(int i = 0 ; i < N ; i++ ) 15 { 16 p = (*LNode)malloc(sizeof(LNode)); 17 p->next = NULL ; 18 cin >> p->data ; 19 p->next = head->next; 20 head->next = p ; 21 return 1 ; 22 } 23 }