以下数据声明都代表什么含义:
float(**def)[10];double*(*gh)[10];double(*f[10])();
int*((*b)[10]);long (*fun)int;int (*(*f)(int, int))(int);
一道很小心的面试题,主要考了指针数组、数组指针以及函数指针的概念。
一、几者的区别 malloc/free 是 c 语言中分配内存空间的函数,malloc 创建空间,free 释放空间。 new/delete 是 c++中分配内存的操作符,new 创建空间,delete 删除空间。 new[]/delete[] 也是 C++中的操作符,用来给数组分配和释放空间。 malloc 只是简单的分 ... 阅读更多
以下数据声明都代表什么含义:
float(**def)[10];double*(*gh)[10];double(*f[10])();
int*((*b)[10]);long (*fun)int;int (*(*f)(int, int))(int);
一道很小心的面试题,主要考了指针数组、数组指针以及函数指针的概念。
安装 vim8.0 可以先参考页面升级安装 vim8.0 并添加插件支持。
LuaJIT 下载页面:luajit.org,Lua 下载页面:lua.org 。
|
1 2 3 4 5 |
wget https://www.lua.org/ftp/lua-5.3.4.tar.gz tar -zxvf lua-5.3.4.tar.gz cd lua make linux test make install |
相对于栈和链表等数据结构来说,树有着更复杂的结构。正如我们平常生活中看到的树一样,它有很多分支,而且分支上面还会有分支。 树的用途十分广泛,最常见的树是二叉树,衍生了很多类型的树,红黑树,搜索树等等,被用来查找效率十分高,一个最典型的应用就是 mysql 中的索引。 树是由很多个节点构成,要实现一个树最 ... 阅读更多
一、 SELECT 介绍 1.1 SELECT SELECT 是数据库四大基本操作的一种,用于查询表中的数据信息。 基本的查询语法为:SELECT 列 1, 列 2, ... FROM 表,表示从表中取出对应的列。 SELECT 语句的用法多种多样,并且还有很多高级的操作 (如排序、分组以及联合等等),是增删改查 ... 阅读更多
一、链表的遍历 链表的遍历算是十分简单了,从头到尾获取 next 指针的值,如果 next 不为 0,一直打印。
|
1 2 3 4 5 6 7 8 9 10 11 12 13 |
// 遍历链表,结果保存在 vector 中返回 template <typename T> std::vector<T> CMyList<T>::traversal() const { vector<T> v; CListNode<T> *p = root.getNext(); while (p) { v.push_back(p->getData()); p = p->getNext(); } return v; } |
这是一个链表和双向链表都可以使用的打印方式,但是对于循环链表来说要注意起始节点。 二、链表反转 链表反转在面试中经常会考的问题,总 ... 阅读更多
双向链表是链表的一个分支,相比单向链表来说多了个一个前向指针 pre,指向当前节点的前一个节点,查找起来更为灵活。 二、链表节点实现 双向链表的节点可以继承单向链表的节点,添加一个 pre 成员即可。两者声明和实现方式都差不多:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 |
template <typename T> class CDoubleList; template <typename T> class CListNode { public: CListNode() : pre(0), next(0), list(0) {} CListNode(T data, CDoubleList<T>* list = 0, CListNode<T>* pre = 0, CListNode<T>* next = 0) : data(data), list(list), pre(pre), next(next) {} ~CListNode() { // if (next) delete next; pre = 0; next = 0; list = 0; }; CListNode<T> * getPre() const { return pre; } void setPre(CListNode<T> * val) { pre = val; } CListNode<T> * getNext() const { return next; } void setNext(CListNode<T> * val) { next = val; } CDoubleList<T>* getList() const { return list; } void setList(CDoubleList<T>* val) { list = val; } T getData() const { return data; } void setData(T val) { data = val; } private: T data; CListNode<T> * pre; CListNode<T> * next; CDoubleList<T>* list; }; |
二、链表实 ... 阅读更多
一、单向链表 1.1 单向链表 链表是一种线性结构,通过一个链把所有的节点都链起来,因此叫做链表。它和数组最大的不同是:数组的内存是连续的,而链表不是。数组支持随机读写,但是插入和删除麻烦,链表不支持随机读写,但是插入和删除很方便。在更多场景下,链表用途更广。 一个链表的图形示例如下,每个链表节点都 ... 阅读更多
队列是一种先进先出的数据结构,因和平常生活中的排队流程一样因此被称为队列。操作逻辑和栈刚好相反。 常用操作: enqueue: 元素入队 dequeue: 首元素出队 size: 返回队列中元素的个数 empty: 判断队列是否为空 front: 返回队首元素 它有两个指针分别指向队列开头和结尾,出 ... 阅读更多
顺序栈的实现和使用数组实现原理一样,都是预先申请一段连续的地址块作为数据域,通过栈顶下标或指针移动完成压栈、出栈等操作。不同的是,使用指针的顺序栈支持栈满时扩容操作,原理更倾向于 vector 的实现。 顺序栈初始化时申请一块固定大小内存空间保存数据,栈顶指针在内存区域来回移动: 要注意的是,初始时栈为 ... 阅读更多