![](https://img-blog.csdnimg.cn/20201014180756916.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
C/CPP
文章平均质量分 50
shangyaowei
这个作者很懒,什么都没留下…
展开
-
Djyos的可移植性(转载)
http://www.djyos.com/?page_id=41Djyos的可移植性 提到可移植性,很多人会想到汇编,许多操作系统会把汇编行数看做可移植性的首要指标。其实,这又是一个误区。我们在谈论可移植性之前,还是要先弄清楚一个问题,即什么是可移植性!这也算问题吗?移植不就是把操作系统从一个硬件平台换到另一个硬件平台运行吗?这样理解,未免太片面了。软件的可原创 2013-12-19 20:49:08 · 735 阅读 · 0 评论 -
C编程方面的好书
下面是我认为C编程方面的优秀书籍:《C语言程序设计》——BrianW. Kernighan和DennisM. Ritchie《C专家编程》《C语言解惑》《C陷阱与缺陷》《C语言接口与实现》《C语言深度解析》《C与指针》欢迎大家来补充!我准备针对每个方面都列一个书单,大家补充的时候,请注意是否属于这个方面的。原创 2013-12-19 20:48:50 · 440 阅读 · 0 评论 -
动态链接库中函数的地址确定---PLT…
前面写过动态链接库延迟绑定的一篇博文,那篇文章我非常喜欢,但是当时刚搞清楚,自己写的比较凌乱,我最近学习了Ulrich Drepper的How towrite share library,学习了几篇其他的讲述动态链接的文章,再次整理了这篇文章。 有一个问题是我们调用了动态链接库里面的函数,我们怎么知道动态链接库里面的函数的地址呢?事实上,直到我们第一次调用这个函数,我们并不知道这原创 2013-12-19 20:48:37 · 677 阅读 · 0 评论 -
C函数调用与堆栈的变化
这篇blog试图讲明当一个c函数被调用时,一个栈帧(stackframe)是如何被建立,又如何被消除的。这些细节跟操作系统平台及编译器的实现有关,下面的描述是针对运行在Intel奔腾芯片上Linux的gcc编译器而言。c语言的标准并没有描述实现的方式,所以,不同的编译器,处理器,操作系统都可能有自己的建立栈帧的方式。 一个典型的栈帧 ESP==>|原创 2013-12-19 20:48:24 · 474 阅读 · 0 评论 -
一些经典的计算机书籍
以下列表中的计算机书籍(中文版)来自微博:@程序员的那些事 粉丝的推荐。按推荐次数,从高到低往下排。如果大家还有其他计算机相关的经典书籍推荐,请在评论中留言,或者在这条微博的评论中留言,我们将继续扩充这个列表。算法导论(第2版)代码大全(第2版)C++ Primer中文版(第4版)设计模式:可复用面向对象软件的基础浪潮之巅Java编程思想(第4版)Jav原创 2013-12-19 20:48:07 · 418 阅读 · 0 评论 -
C语言 地址相减
举一个小例子说明一下,C中地址相减的结果是比较有趣的。例:int a[3];int *s1,*s2;char *t1,*t2;a[0]=1;a[1]=2;a[2]=3;s1=a;s2=&a[2];s2-s1=?t1=(char*)a;t2=(char*)&a[2];t2-t1=? 解析: s2-s1=2; t2-t1=8;why? C语言中的地址相减,其实并不是,我们原创 2013-12-19 20:47:57 · 993 阅读 · 0 评论 -
面试题目---C语言可变参数函…
原文地址:面试题目---C语言可变参数函数的实现作者:sunwillow这道题的关键是理解函数参数的压栈顺序:1、函数的参数是从右到左压栈;2、栈的生长方向是从上到下(即从高地址往低地址)3、printf(char *fmt,...) fmt 是放在栈顶(最低地址),第二个参数是高一个地址,4、第二个参数的获取方法是 (char *)&fmt +sizeof(fmt) ,这个就是第二转载 2013-12-19 20:47:52 · 712 阅读 · 0 评论 -
数组指针和数组头指针
4. main() { int a[5]={1,2,3,4,5}; int *ptr=(int *)(&a+1); printf("%d,%d",*(a+1),*(ptr-1)); } 输出结果是什么? 答案:输出:2,5 *(a+1)就是a[1],*(ptr-1)就是a[4],执行结果是2,5 &a+1不是首地址+1,系统会认为加一个a数组的偏原创 2013-12-19 20:47:41 · 2369 阅读 · 0 评论 -
宏定义
宏定义宏定义是C提供的三种预处理功能的其中一种,这三种预处理包括:宏定义、文件包含、条件编译。1.不带参数的宏定义:宏定义又称为宏代换、宏替换,简称“宏”。 格式: #define 标识符 字符串 其中的标识符就是所谓的符号常量,也称为“宏名”,字符串可以是常数、表达式、格式串等。在编译预处理时,对程序中所有出现的“宏名”,都用宏定义中的字符串去代换,这称为“宏原创 2013-12-19 20:47:39 · 357 阅读 · 0 评论 -
位域
使用位域的主要目的是压缩存储,其大致规则为: 1)如果相邻位域字段的类型相同,且其位宽之和小于类型的sizeof大小,则后面的字段将紧邻前一个字段存储,直到不能容纳为止; 2)如果相邻位域字段的类型相同,但其位宽之和大于类型的sizeof大小,则后面的字段将从新的存储单元开始,其偏移量为其类型大小的整数倍; 3)如果相邻的位域字段的类型不同,则各编译器的具原创 2013-12-19 20:47:37 · 259 阅读 · 0 评论 -
链表合并
(2)已知两个链表head1 和head2 各自有序,请把它们合并成一个链表依然有序。(保留所有结点,即便大小相同)Node * Merge(Node *head1 , Node *head2){if ( head1 == NULL)return head2 ;if ( head2 == NULL)return head1 ;Node *head = NULL ;Node *p1原创 2013-12-19 20:47:33 · 427 阅读 · 0 评论 -
INT_MIN和INT_MAX溢出问题
C中int类型32位,范围是-2147483648到2147483647. (1)最轻微的上溢是 INT_MAX + 1 :结果是INT_MIN。 (2)最严重的上溢是 INT_MAX + INT_MAX :结果是-2。 (3)最轻微的下溢是 INT_MIN - 1 :结果是INT_MAX。 (4)最严重的下溢是 INT_MIN +INT_MIN :结果是 0。 应原创 2013-12-19 20:47:28 · 806 阅读 · 0 评论 -
带环链表求环的起点
很经典的问题了,求环的长度可以用两个步长分别为1和2的指针遍历链表,直到两者相遇,此时慢指针走过的长度就是环的长度。另外相遇后把其中指针重新设定为起始点,让两个指针以步长1再走一遍链表,相遇点就是环的起始点。 证明也很简单,注意第一次相遇时慢指针走过的路程S1 = 非环部分长度 + 弧A长快指针走过的路程S2 = 非环部分长度 + n * 环长 + 弧A长S1 * 2 = S2原创 2013-12-19 20:47:24 · 549 阅读 · 0 评论 -
带环的链表
原文地址:带环的链表作者:wRonSKy 单链表的问题在面试考试等等等等中频频上镜,大有赶上凤姐超越芙蓉之势。假若有一个蛋疼的程序猿把单链表的末尾结点的next指针指向了单链表中一个随机的结点上,那么我们经常写的一个循环while(p)或者while(p->next)就可以父传子子传孙子子孙孙无穷尽了。 话说怎么判断单链表是否带环了呢?大部分人都知道了:让快指针追慢指针,追上了就有转载 2013-12-19 20:47:22 · 294 阅读 · 0 评论 -
C++访问控制-三种继承方式
不同继承方式的影响主要体现在:1、派生类成员对基类成员的访问控制。2、派生类对象对基类成员的访问控制。三种继承方式:1、公有继承(public)① 基类的public和protected成员的访问属性在派生类中保持不变,但基类的private成员不可访问。② 派生类中的成员函数可以直接访问基类中的public和protected成员,但不能访问基类的private成员。③ 通过派生类原创 2013-12-19 20:46:50 · 2495 阅读 · 1 评论 -
enum类型的本质
至从C语言开始enum类型就被作为用户自定义分类有限集合常量的方法被引入到了语言当中,而且一度成为C++中定义编译期常量的唯一方法(后来在类中引入了静态整型常量)。 根据上面对enum类型的描述,到底enum所定义出来的类型是一个什么样的类型呢?作为一个用户自定义的类型其所占用的内存空间是多少呢?使用enum类型是否真的能够起到有限集合常量的边界约束呢?大家可能都知道原创 2013-12-19 20:46:48 · 394 阅读 · 0 评论 -
如何实现在类中定义真正的const成…
有时我们希望某些常量只在类中有效。由于#define定义的宏常量是全局的,不能达到目的,于是想当然地觉得应该用const修饰数据成员来实现。const数据成员的确是存在的,但其含义却不是我们所期望的。const数据成员只在某个对象生存期内是常量,而对于整个类而言却是可变的,因为类可以创建多个对象,不同的对象其const数据成员的值可以不同。 不能在类声明中初始化const数据成员。以下用原创 2013-12-19 20:46:46 · 417 阅读 · 0 评论 -
提高代码水平方面的优秀书目
作者:gfree.wind@gmail.com博客:blog.focus-linux.net下面的书籍,我认为绝对有助于提高代码的质量和水平。这里没有列出算法方面的书籍——那些书籍会在另一篇文章中列出:《高质量程序设计指南——C++/C语言》《程序员修炼之道》《编程高手箴言》《软件随想录》《编程珠玑》《高效程序员的45个习惯》《代码之美》《架构之美》《代码大全》《代码质量原创 2013-12-19 20:48:54 · 548 阅读 · 0 评论 -
[C/C++]函数参数的入栈顺序与可变…
#includevoid foo(int x, int y, int z){ printf("x= %d at [%X]\n", x, &x); printf("y= %d at [%X]\n", y, &y); printf("z= %d at [%X]\n", z, &z);}int main(int argc, char *ar原创 2013-12-19 20:48:59 · 449 阅读 · 0 评论 -
国外程序员推荐:每个程序员都应读…
【更新】:近日(2012年8月17日)重看StackOverflow 的原讨论帖,发现于今年年初被关闭了。不过有人做了汇总,把其他回复中提到的书籍,放在投票数最高的回复中。新更新添加59 本书,详情可见文章后半部分。编者按:2008年8月4日,StackOverflow 网友 BertF 发帖提问:哪本最具影响力的书,是每个程序员都应该读的?“如果能时光倒流,回到过去,作为一个原创 2013-12-19 20:49:12 · 539 阅读 · 0 评论 -
参数可变函数的实现(上)
此文献给如我一般还在探索C语言之路的朋友们。 注:本文中测试程序的编译环境为win2000和VC6.0缘起:作为一个程序员,我没有写过参数可变的函数,我相信大部分朋友也没有涉及过,或者我的境界层次太低了。那么缘何我要去揭这一层面纱呢?因为好奇!我是个思维具有极大惰性的人,曾经识得参数可变函数,也懒得去深究,但是它的三点(函数声明时参数列表中的“…”)却深刻的映入了我的记忆里,而原创 2013-12-19 20:48:57 · 408 阅读 · 0 评论 -
编写安全代码:再论整数类型转换
本文的copyleft归gfree.wind@gmail.com所有,使用GPL发布,可以自由拷贝,转载。但转载请保持文档的完整性,注明原作者及原链接,严禁用于任何商业用途。作者:gfree.wind@gmail.com博客:linuxfocus.blog.chinaunix.net 前几天看C99标准,写了两篇关于整数提升的博文,http://blog.chinaunix.net原创 2013-12-19 20:48:48 · 356 阅读 · 0 评论 -
C语言异或操作的妙用
如果想要交换2个变量,一般的做法是引入第三个变量, 例如, [cpp] viewplaincopytemp = a; a = b; b= temp; 这样2个变量中的值就实现了交换。那能不能不引入其他变量就可以实现变量值的交换呢?答案是肯定的。用异或操作可以实现,有2种实现方法,本质上是一样的。法1: [cpp] vi原创 2013-12-19 20:47:48 · 3543 阅读 · 0 评论 -
C/C++ 通用 Makefile
Generic Makefile for C/C++Program ================================================== Keywords: Makefile, make,Generic, C/C++ Author: whyglinux (whyglinux AT hotmail DOTcom) Date: 2006-0原创 2013-12-19 20:47:44 · 373 阅读 · 0 评论 -
整数溢出,如何判断整数溢出
c语言中存在两类整数算术运算,有符号运算和无符号运算。在无符号运算里,没有了符号位,所以是没有溢出的概念的。所有的无符号运算都是以2的n次方为模。如果算术运算符的一个操作数是有符号书,另一个是无符号数,那么有符号数会被转换为无符号数(表示范围小的总是被转换为表示范围大的),那么溢出也不会发生。但是,当两个操作数都是有符号数时,溢出就有可能发生。而且溢出的结果是未定义的。当一个运算的结果发生原创 2013-12-19 20:46:58 · 537 阅读 · 0 评论 -
typeid详解
在揭开typeid神秘面纱之前,我们先来了解一下RTTI(Run-Time TypeIdentification,运行时类型识别),它使程序能够获取由基指针或引用所指向的对象的实际派生类型,即允许“用指向基类的指针或引用来操作对象”的程序能够获取到“这些指针或引用所指对象”的实际派生类型。在C++中,为了支持RTTI提供了两个操作符:dynamic_cast和typeid。 dynam原创 2013-12-19 20:46:56 · 415 阅读 · 0 评论 -
RTTI、虚函数和虚基类的开销分析及…
“在正确的场合使用恰当的特性” 对称职的C++程序员来说是一个基本标准。想要做到这点,首先要了解语言中每个特性的实现方式及其开销。本文主要讨论相对于传统C而言,对效率有影响的几个C++新特性。C++引入的额外开销体现在以下两方面:编译时开销模板、类层次结构、强类型检查等新特性,以及大量使用了这些新特性的C++模板、算法库都明显地增加了C++编译器的负担。但是应当看到,这些新机能在不增加原创 2013-12-19 20:46:54 · 478 阅读 · 0 评论 -
定义C/C++全局变量/常量几种方法的…
在讨论全局变量之前我们先要明白几个基本的概念: 1. 编译单元(模块): 在IDE开发工具大行其道的今天,对于编译的一些概念很多人已经不再清楚了,很多程序员最怕的就是处理连接错误(LINKERROR), 因为它不像编译错误那样可以给出你程序错误的具体位置,你常常对这种错误感到懊恼,但是如果你经常使用gcc,makefile等工具在linux或者嵌入式下做开发工作的话,那么你可能原创 2013-12-19 20:44:20 · 685 阅读 · 0 评论 -
h文件和.c文件的区别与联系
原文地址:h文件和.c文件的区别与联系作者:聪明的笨蛋简单的说其实要理解C文件与头文件有什么不同之处,首先需要弄明白编译器的工作过程,一般说来编译器会做以下几个过程:1.预处理阶段2.词法与语法分析阶段3.编译阶段,首先编译成纯汇编语句,再将之汇编成跟CPU相关的二进制码,生成各个目标文件4.连接阶段,将各个目标文件中的各段代码进行绝对地址定位,生成跟特定平台相关的可执行文件,当然,最后转载 2013-12-19 20:44:18 · 772 阅读 · 0 评论 -
undefined reference to `jpeg_std…
用gcc编译的动态库要在g++中使用的话,在包含头文件时要使用extern "C".如:extern "C" {#include }。因为c++编译器会对函数名进行重整。不然会提示找不到函数名。原创 2013-12-19 20:43:48 · 445 阅读 · 0 评论 -
静态类数据成员、const与类
每个对象的数据成员都是独立的,在内存中各自独立,但是对象的成员函数的创建和放置在内存中只有一个地方。一、静态类数据成员:前面说过每个对象包含它自己独立的数据,但是当数据项被声明为static后,不管存在多少对象,整个类只会创建一个这样的数据项。静态类数据成员与普通静态变量相同点:只在类中可见,但是生存周期与整个程序相同。即使没有了类的对象,他依然存在。不同点:普通的静态变量被用来在各个原创 2013-12-19 20:43:39 · 351 阅读 · 0 评论 -
常成员函数
原文地址:常成员函数作者:Fredconst成员函数 一些成员函数改变对象,一些成员函数不改变对象。例如:intPoint::GetY(){ return yVal;} 这个函数被调用时,不改变Point对象,而下面的函数改变Point对象:voidPoint:: SetPt (int x, int y){ xVal=x; yVal=y;} 为了使成转载 2013-12-19 20:43:37 · 402 阅读 · 0 评论 -
cvQueryFrame获取的图像和cvReleas…
在项目中需要从原始图像中截取感兴趣的子区域保存,于是利用cvCopy就写了个cvSubImage方法:2010-08-26 10:19:void cvSubImage(IplImage* srcImage, CvRect rect, IplImage*destImage){//从图像orgImage中提取一块(rectInImage)子图像imgRect cvSet原创 2013-12-19 20:42:59 · 1638 阅读 · 0 评论 -
嵌入式C语言面试题(一)
1.用预处理指令#define 声明一个常数,用以表明1年中有多少秒(忽略闰年问题) #define SECONDS_PER_YEAR (60 * 60 * 24 * 365)UL 我在这想看到几件事情: 1). #define 语法的基本知识(例如:不能以分号结束,括号的使用,等等) 2).懂得预处理器将为你计算常数表达式的值,因此,直接写出你是如何计算一年中有多少秒而不原创 2013-12-19 20:41:35 · 459 阅读 · 0 评论 -
C语言数据类型大小和结构体中变量…
【注释】本博文介绍十分详细,本人收益良多,特此收藏。【出处】源自网络,原始出处未知。 C语言数据类型大小和结构体中变量的地址分配方法数据类型: char short int long float double (long double)gcc3.2.2: 1 2 4 4 4 8原创 2013-12-19 20:41:14 · 650 阅读 · 0 评论 -
linux中字符串转换函数 simpl…
Linux内核中提供的一些字符串转换函数:lib/vsprintf.c [html] viewplaincopyprint? 1. unsigned long long simple_strtoull(const char *cp, char **endp, unsigned int base) 2. unsigned long simple_st原创 2013-12-19 20:53:08 · 377 阅读 · 0 评论 -
名书收藏
计算机经典书籍 1、Java Java编程语言(第三版)---Java四大名著----James Gosling(Java之父) Java编程思想(第2版)----Java四大名著----Bruce Eckel Java编程思想(第3版)----Java四大名著----------------Bruce Eckel JAVA 2核心技术 卷I:原创 2013-12-19 20:46:35 · 374 阅读 · 0 评论 -
软件工程师笔试题(C/C++)
2008-03-25 18:19预处理器(Preprocessor)1. 用预处理指令#define 声明一个常数,用以表明1年中有多少秒(忽略闰年问题) #define SECONDS_PER_YEAR (60 * 60 * 24 *365)UL 我在这想看到几件事情: 1). #define语法的基本知识(例如:不能以分号结束,括号的使用,等等)原创 2013-12-19 20:46:32 · 392 阅读 · 0 评论 -
静态成员函数调用非静态成员变量-p…
C++会区分两种类型的成员函数:静态成员函数和非静态成员函数。这两者之间的一个重大区别是,静态成员函数不接受隐含的this自变量。所以,它就无法访问自己类的非静态成员。 在某些条件下,比如说在使用诸如pthread(它不支持类)此类的多线程库时,就必须使用静态的成员函数,因为其地址同C语言函数的地址兼容。这种铜限制就迫使程序员要利用各种解决办法才能够从静态成员函数访问到非静态数据成原创 2013-12-19 20:44:01 · 527 阅读 · 0 评论 -
typedef 和函数指针问题深入总结
一、函数指针一个函数在编译时被分配一个入口地址,将这个入口地址称为函数的指针,可以用一个指针变量指向该函数指针,然后通过该变量来调用函数。有关说明:1、函数指针的声明格式:函数返回值类型(*指针变量名)(参数类型列表)或者是:typedef 函数返回值类型 (*指针变量名)(参数类型列表)2、一个函数指针只能指向一种类型的函数,即具有相同的返回值和相同的参数的函数.3.关于函数指针的原创 2013-12-19 20:43:42 · 326 阅读 · 0 评论