- 博客(28)
- 资源 (1)
- 收藏
- 关注
原创 随笔1
1.实数赋值给整型时一般都是去掉小数部分,而不是四舍五入。float a = 345.92;char b = a;printf("%d:%d\n",a,b);此时输出a是一个很大的数(是因为float在内存中存储方式与整形不同),而b则为89(345转换为16进制为0x159,超过了1个字节所以发生截断)。2.Free释放内存时传递的是一个指针,那么free是怎么知道要释放多大
2014-06-14 15:35:13
768
原创 字符串分割
字符串分割(1).char *strtok(char s[], const char *delim);strtok()用来将字符串分割成一个个片段。参数s指向欲分割的字符串,参数delim则为分割字符串中包含的所有字符。当strtok()在参数s的字符串中发现参数delim中包含的分割字符时,则会将该字符改为\0 字符。在第一次调用时,strtok()必需给予参数s字符串,往后的调用则将参
2014-06-14 15:33:29
1008
原创 linux定时器
1.时间获取函数用于获得当前时间:*time_t time(2) / time_t (秒)* ftime(3) / struct timeb (毫秒)* gettimeofday(2) / struct timeval (微秒)* clock_gettime(2) / struct timespec (纳秒)* gmtime / localtime / timegm / mkt
2014-06-14 14:57:11
905
原创 字节对齐
为什么要字节对齐,用意何在? 如果一个变量的内存地址正好位于它长度的整数倍,他就被称做自然对齐。比如在32位cpu下,假设一个整型变量的地址为0x00000004,那它就是自然对齐的。需要字节对齐的根本原因在于CPU访问数据的效率问题。假设之前整型变量的地址不是自然对齐,比如为0x00000002,则CPU如果取它的值的话需要访问两次内存,第一次取从0x00000002-0x00000003
2014-06-14 10:49:51
639
原创 宏定义#_##的作用
宏定义中#,##的作用宏中的#的功能是将其后面的宏参数进行字符串化操作(Stringizing operator),简单说就是在它引用的宏变量的左右各加上一个双引号。如定义好#define STRING(x) #x之后,下面二条语句就等价。 char *pChar = "hello"; char *pChar = STRING(hello);还有一个#@
2014-06-14 09:22:23
1042
原创 do{}while(0)的妙用
Do{}while(0)的妙用:在很多代码里看到do{}while(0)这样的写法,以前一直觉得只是好看而已,但其实这样写是有其用意的。a、辅助定义复杂的宏,避免引用的时候出错,举例来说,假设你需要定义这样一个宏:#define DOSOMETHING()\ foo1();\ foo2();这个宏的本意是,当调用DOS
2014-06-14 09:08:23
640
原创 命名空间
命名空间:(1)由于现在软件规模越来越大,不可避免由很多人合作开发,这样就必然会产生全局变量(函数,类等)命名冲突的问题。所以在C++等语言中引入了namespace解决这个问题。namespace允许像类,对象,函数聚集在一个名字下,从本质上来讲namespace是对全局作用域的细分,允许同名全局变量(函数,类等)的定义。例如:namespace first{ int va
2014-06-14 09:05:36
680
原创 长度为0的数组
看一些开源项目时经常看到如下代码:注意上面最后一行的代码,这里定义了一个长度为0的数组,这种用法可以吗?为什么可以使用长度为0 的数组?长度为的数组到底怎么使用?首先长度为0的数组在标准c和c++中是不允许的,如果使用长度为的数组,编译时会产生错误,提示数组长度不能为0。但在GNUc中,这种用法却是合法的。它的最典型的用法就是位于数组中的最后一项,如上面所示,这样做主要是为了方
2014-06-14 09:01:01
929
原创 库链接附录
1、“=” make会将整个makefile展开后,再决定变量的值。也就是说,变量的值将会是整个makefile中最后被指定的值。看例子: x = foo y = $(x) bar x = xyz 在上例中,y的值将会是 xyz bar ,而不是 foo bar 。 2、“:=”
2014-05-26 08:43:02
750
原创 Android.mk用法基础
1.android整个工程只有一个Makefile,听起来似乎是一件很疯狂的事情,因为这个Makefile可能会变得无比庞大和复杂。其实不用担心,我们可以按照模块来将这个Makefile划分成一个个Makefile片段(fragement),然后通过Makefile的include指令来将这些Makefile片段组装在一个Makefile中。与递归Makefile相比,每一个模块现在拥有的是一个M
2014-05-25 18:23:02
1156
原创 Makefile基础
1.Makefile里的subst为字符串替换函数,用法是$(subst FROM,TO,TEXT),即将TEXT中的东西从FROM变为TO。示例: $(subst a,the,There is a big tree) 把“There is a big tree”中的“a”替换成“the”,返回结果是“There is the big tree”。2.patsubst为模式字符串
2014-05-25 18:21:57
587
原创 linux简单字符驱动示例
#include #include #include #include #include #include #include #include#define FREMAKS_DEVICE_CLASS_NAME "fremaks_class"#define FREMAKS_DEVICE_FILE_NAME "fremaks_file"//注意在dev目录下显示的是这个名字
2014-05-24 19:09:59
803
转载 Android编译系统简要介绍和学习计划
在Android源码环境中,我们开发好一个模块后,再写一个Android.mk文件,就可通过m/mm/mmm/make等命令进行编译。此外,通过make命令还可制作各种系统镜像文件,例如system.img、boot.img和recovery.img等。这一切都得益于Android编译系统,它为我们处理了各种依赖关系,以及提供各种有用工具。本文对Android编译系统进行简单介绍以及制定学习计划。
2014-05-06 09:00:03
635
原创 select,poll,epoll的区别及联系
select,poll,epoll的区别及联系int select(int nfds, fd_set *readfds, fd_set *writefds, fd_set *exceptfds, struct timeval *timeout);int poll(struct pollfd *fds, nfds_t nfds, int timeout);int epoll_wait(i
2014-04-19 17:59:08
655
原创 八皇后问题
八皇后是一道很具典型性的题目。它的基本要求是这样的:在一个8*8的矩阵上面放置8个物体,一个矩阵点只允许放置一个物体,任意两个点不能在一行上,也不能在一列上,不能在一条左斜线上,当然也不能在一条右斜线上。算法思路: (1)在第n行探测某列(从0开始)是否可以放置皇后(2)如果没有可以位置可以放置皇后,返回探测其他列是否可以放置(遍历0~7列)(3)如果可以
2013-12-19 17:29:36
656
原创 汉诺塔递归实现[C代码]
设有X,Y,Z三根柱子,X上开始有n个盘子1 当n=1时: 将盘子从X柱直接移到Z柱; 2 当n=2时: 首先将编号为1的盘子从X柱移到Y柱; 其次将编号为2的盘子从X柱移到Z柱; 最后将编号为1的盘子从Y柱移到Z柱;3 当n=n时: 首先将n-1个
2013-12-18 10:42:22
755
原创 [C++ Primer] 重载操作符与转换
1. 不能通过连接其他合法符号来创建任何新的操作符,例如试图定义一个operator**操作符以提供求幂操作是非法的;用于内置类型的操作符其含义不能改变,例如 int operator+(int, int)就是非法的;也不能为任何内置类型定义额外的新的操作符,例如不能定义接受两个数组类型操作数的operator+-----(数组时内置类型??)注意:重载操作符必须具有至少一个类类型或枚举
2013-09-12 19:27:55
894
原创 [C++ Primer] 面向对象编程
1.要注意区分类和类对象,对象只能访问public成员,而类和友元(当然也可以访问public成员)可以访问private成员。而对于基类的protected成员,只有派生类可以访问其基类的protected成员,不能通过派生类对象在类外访问protected成员(这点与private类似)(值得注意的是:在派生类中定义一个函数接受派生类对象的引用(指针)或者直接定义一个派生类对象,此时可以通过此
2013-09-12 19:19:36
1018
原创 [C++ Primer] 复制控制
复制构造函数:当定义一个新对象并用一个同类型的对象对它进行初始化时,将显式使用复制构造函数 A a = A();当将该类型的对象传递给函数或从函数返回该类型的对象时,将隐式使用复制构造函数(显式使用和隐式使用的区别?)析构函数:当对象超出作用域或动态分配的对象被删除时,将自动应用析构函数。复制构造函数,赋值操作符和析构函数总称为复制控制。编译器自动实现这些操作,但类也可以定义自己的版本。
2013-09-10 20:17:32
815
原创 [C++ Primer] 类
1.在定义一个类之前可以声明,class Screen;这个声明就是前向声明,在程序中引入了类类型的Screen,在声明之后定义之前,Screen是一个不完全类型,即已知Screen是一个类型,但不知道包含哪些成员。我们知道定义一个类的对象会为其分配内存空间,而当Screen为不完全类型的时候,显然是不能定义Screen对象的,除此之外不完全类型只能定义指向该类的指针或者引用,或者用于声明(不是
2013-09-10 17:28:22
1102
原创 [C++ Primer] 关联容器
相关知识介绍: 关联容器和顺序容器的本质区别在于关联容器通过键(key)存储和读取元素,而顺序容器则通过元素在容器中的位置顺序存储和访问元素。 map的元素以键-值的形式组织,set仅包含一个键,两种都不支持一个键多次出现,而multimap和multiset则支持。 pair类型为map类型的元素类型,包含两个数据值,first和second。
2013-09-05 09:36:01
695
原创 [C++ Primer] 顺序容器
1.顺序容器的初始化:a. C c; 创建一个名为c的空容器b. C c(c2); 创建容器c2的副本c,c和c2必须有相同的容器类型,并存放相同类型的元素c. C c(b, e); c 初始化为一段元素的副本,使用迭代器时不要求容器类型相同,容器内的元素类型也可以不相同,只要能将要复制的元素转换为所构建的新容器的元素类型即可。(注意允许通过内置数组中的一对指针初始化容器,因为指针其实
2013-09-05 00:38:12
616
原创 [C++ Primer] 标准IO库
1.IO对象不可复制或赋值,由于不能复制所以流对象不能存储在vector等容器中,而且函数形参或返回类型也不能为流类型,如果需要传递或者返回IO对象,则必须传递或者返回该对象的指针或者引用。2.如果在一个循环中读取若干个文件,且打算重用已存在的流对象,那么必须在每次循环结束后关闭(close)和清空(clear)文件流。原因在于如果遇到文件结束符或者其他错误,将设置流的内部状态使得不能再对该流
2013-09-04 09:22:10
721
原创 [C++ Primer] 函数
1.在向函数传递大型对象时,使用引用形参可以避免复制从而提高效率,而且某些类类型是无法复制的(??),当然传递指针也是可行的。如果使用引用形参唯一的目的是避免复制实参(即不需要修改实参),那么应该将形参定义为const引用,因为非const引用使用不太灵活,这样的形参使得不能使用const对象,也不能用字面值,产生右值的表达式,需要类型转换的对象作为实参。int incr(int &var)
2013-09-04 00:40:49
664
原创 [C++ Primer] 语句
1.switch表达式与case标号:case标号必须是整型常量表达式,下面的都是错误用法,case 3.14,case iavl; switch只能再最后一个case标号或default标号后定义变量。这样是为了避免出现代码跳过变量的定义和初始化的情况。如果在两个case之间定义变量,该变量会在块结束之前一直存在,对定义该变量之后的其他case标号所关联的代码都可以使用这个变量,如果sw
2013-09-03 00:22:34
1007
原创 [C++ Primer] 标准库string类型
[杂记:C++中类型一、内置类型如int, char, float, unsigned等。内置类型是最基本的类型。二、复合类型复合类型:使用其它类型定义的类型。有三种复合类型:引用,指针,数组。三、类类型就是类。比如string以及自己定义的类。]1.由于历史原因以及为了与语言兼容,字符串字面值与标准库string类型不是同一种类型,前者是C风格字符串以“NUL
2013-09-03 00:22:12
701
原创 [C++ Primer] 数组和指针
1.C++中标准库vector类似于C语言中数组的概念,当然C++中也能使用数组,但是呢C++程序应该尽量使用vector和迭代器类型,只有在设计良好的程序并强调速度时才在类实现的内部使用数组和指针。以下是部分理由:与vector类型相比,数组的缺陷在于,数组的长度是固定的,如果要更改数组的长度,程序员只能创建一个更大的数组。2.数组的定义----数组的长度必须用值大于或等于1的常量表达式定义
2013-09-03 00:21:54
1167
原创 extern深度解析
C语言中extern用法: 对于全局变量来说,extern关键字可以在一个模块中使用在另一个模块中定义的全局变量.只要extern声明一下就好,但是变量只能定义一次,不然链接的时候会报错.(现代编译器一般采用按文件编译的方式,因此在编译时,各个文件中定义的全局变量是互相不透明的。也就是说,在编译时,全局变量的可见域限制在文件内部。但是到了链接阶段,要将各个文件的内容“合为一体”,因此,如
2013-08-30 09:57:18
966
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人