程序设计基础
nawuyao
这个作者很懒,什么都没留下…
展开
-
数组指针加1操作的含义
一般而言,对指针进行加1操作,得到的将是下一个元素的地址,一个类型为T的指针移动,是以sizeof(T)为移动单位。#include<stdio.h>int main(){ int a[5]={1,2,3,4,5}; int b[100]; int *ptr=(int*)(&a+1); //&a+1的单位是int(*)[5]原创 2015-12-13 19:26:26 · 5888 阅读 · 0 评论 -
在C++中,关键字explicit的作用
在C++中,一个参数的构造函数(或者处理第一个参数外其余参数都有默认值的多参数构造函数)一般具有两个功能:构造器和默认且隐含的类型转换操作符。所有,当AAA=XXX时,恰好XXX的类型正好是AAA单参数构造器的参数类型,这时候编译器就自动调用这个构造器,创建一个AAA的对象。而在某些情况下,却违背了程序员的本意。这时候在这个构造器前面加explicit修饰,指定这个构造函数只能被明确的调用、使用,不原创 2015-12-02 22:11:16 · 497 阅读 · 0 评论 -
内存分配
一、一个C/C++编译的程序所占用的系统内存一般分为以下几个部分:由符号起始的区块段(BSS):BSS段通常是指用来存放程序中未初始化的全局数据和静态数据的一块内存区域。BSS段属于静态内存分配,程序结束后静态变量资源由系统自动释放。数据段:数据段通常是指用来存放程序中已初始化的全局变量的一块内存区域,也属于静态内存分配。代码段:用来存放程序执行代码的一块内存区域。在代码段,也有可能包含一些只原创 2015-12-03 11:07:08 · 580 阅读 · 0 评论 -
使用位操作和逻辑运算符实现两数的加、乘、除法
1、如何使用位操作符实现两个正整数的除法?#include<stdio.h>int div(const int x,const int y){ int left_num=x; int result=0; while(left_num>=y) { int multi=1; while(y*multi<=(l原创 2015-12-07 10:11:25 · 2110 阅读 · 0 评论 -
位操作
1、位操作求两个数的平均值 若用(x+y)/2求两个数的平均值,当两个数比较大时,用这种方法可能会存在数据溢出的情况,采用位运算方法可避免这一问题。 (x&y)+((x^y)>>1) 即是用位运算求解两数的平均值2、用位运算计算数的绝对值int MyAbs(int x){ int y; y=x>>31; return (x^y)-y; //此处也可写成(x+原创 2015-12-06 22:43:58 · 545 阅读 · 0 评论 -
自定义数字和字符串的转换函数
C语言中,常见的字符串与数字之间的相互转换的库函数有:atof(字符串转换成浮点数)、atoi(字符串转换成整型数)、atol(字符串转换成长整形数)、itoa(整型数转换成字符串)、ltoa(长整型数转换成字符串)等。在求职中,让求职者自定义此类函数的实现是为了考察求职者对基本功的掌握。 下面给出两个示例:#include<stdio.h>int Myatoi(char *str){原创 2015-12-14 11:11:22 · 1818 阅读 · 4 评论 -
预处理
一、不使用sizeof,如何求内置类型占用的字节? 一般可用如下方式实现:#define MySizeof(Value) (char*)(&Value+1)-(char*)&Value该宏定义中,(char*)&Value返回Value地址的第一个字节,(char*)(&Value+1)返回Value地址的下一个地址的第一个字节,所以他们的差为所占的字节数。二、如何使用宏求结构体的内存偏移地址?原创 2015-12-03 21:46:31 · 482 阅读 · 0 评论 -
String类的函数体实现代码
#include<iostream>using namespace std;class string{public: String(const char* str=NULL); String(const String& another); ~String(); String& operator=(const String& rhs);priva原创 2015-12-02 12:51:59 · 541 阅读 · 0 评论 -
归并排序
目录要点 归并排序的基本思想算法分析 归并排序算法的性能 时间复杂度 空间复杂度 算法稳定性 归并排序和堆排序、快速排序的比较完整参考代码 Java版本参考资料相关阅读回到顶部要点归并排序是建立在归并操作上的一种有效的排序算法,该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。将已有序的子序列合并,转载 2016-07-15 19:54:18 · 327 阅读 · 0 评论 -
c结构体中的 柔性数组
出处:http://blog.csdn.net/stand1210/article/details/52459372开发C代码时,经常见到如下类型的结构体定义:12345typedefstruct list_t{structlist_t *next;structlist_t转载 2016-09-11 17:23:27 · 380 阅读 · 0 评论 -
三种快排及四种优化方式
出处:http://blog.csdn.net/hacker00011000/article/details/521761001、快速排序的基本思想: 快速排序使用分治的思想,通过一趟排序将待排序列分割成两部分,其中一部分记录的关键字均比另一部分记录的关键字小。之后分别对这两部分记录继续进行排序,以达到整个序列有序的目的。2、快速排序的三个步骤: (1)选择基准:在待排转载 2016-09-19 19:57:13 · 561 阅读 · 0 评论 -
类的静态成员变量
招银科技电话面试的时候,面试官问了我类的保护静态成员的初始化应该在类内还是类外,这个当时确实回答的不是很肯定,故在网上搜索到了这篇文章,觉得博主写的很清晰,谢谢分享。出处:http://www.cnblogs.com/iceqq/archive/2009/05/03/1448147.htmlps:保护属性和私有性质在类内的权限是类似的,这个知识点还是应该明确了解和学习的,虽然是一个简单的知转载 2016-09-22 22:00:24 · 499 阅读 · 0 评论 -
new与malloc的区别,以及内存分配浅析
本来只是想找一个系统的new和malloc的区别的文章,看到了这篇文章涉及其中的内存分配的分析,作为一个小白,觉得还是挺有深度的,转载过来看看,出处:http://www.cnblogs.com/huhuuu/archive/2013/11/19/3432371.html以下是原文:从函数声明上可以看出。malloc 和 new 至少有两个不同: new 返回指定类型的指针,并且可转载 2016-09-21 15:15:16 · 514 阅读 · 0 评论 -
C++封装、继承、多态
转自:http://blog.csdn.net/ruyue_ruyue/article/details/8211809C++封装继承多态总结面向对象的三个基本特征面向对象的三个基本特征是:封装、继承、多态。其中,封装可以隐藏实现细节,使得代码模块化;继承可以扩展已存在的代码模块(类);它们的目的都是为了——代码重用。而多态则是为了实现另一个目的——接口重用!转载 2016-09-24 20:34:02 · 431 阅读 · 0 评论 -
通过结构体成员的地址获取结构体变量的地址
出处:http://blog.csdn.net/zhanshen2015/article/details/51500757C 语言的结构体可以将不同类型的对象聚合到一个对象中,在内存中,编译器按照成员列表顺序分别为每个结构体变量成员分配内存,但由于 C 的内存对齐机制以及不同机器间的差异,各个成员之间可能会有间隙,所以不能简单的通过成员类型所占的字长来推断其它成员或结构体对象的地址。转载 2016-09-28 19:32:47 · 6176 阅读 · 0 评论 -
fopen()函数的使用
出处:矮人狙击手转载 2016-09-28 20:45:33 · 421 阅读 · 0 评论 -
海量数据面试题整理
出处:http://www.educity.cn/wenda/389464.html1. 给定a、b两个文件,各存放50亿个url,每个url各占64字节,内存限制是4G,让你找出a、b文件共同的url? 方案1:可以估计每个文件安的大小为50G×64=320G,远远大于内存限制的4G。所以不可能将其完全加载到内存中处理。考虑采取分而治之的方法。 s 遍历文件a,对转载 2016-09-28 22:27:22 · 418 阅读 · 0 评论 -
C++智能指针简单剖析
导读最近在补看《C++ Primer Plus》第六版,这的确是本好书,其中关于智能指针的章节解析的非常清晰,一解我以前的多处困惑。C++面试过程中,很多面试官都喜欢问智能指针相关的问题,比如你知道哪些智能指针?shared_ptr的设计原理是什么?如果让你自己设计一个智能指针,你如何完成?等等……。而且在看开源的C++项目时,也能随处看到智能指针的影子。这说明智能指针不仅是面试官爱问的题材,转载 2016-10-03 21:16:19 · 343 阅读 · 0 评论 -
指针
一、使用指针有哪些好处可以动态分配内存可以进行多个相似变量的一般访问为动态数据结构,特别是树和链表,提供支持遍历数组高效“复制”数组与结构二、指针与引用的差异指针存放变量的地址,逻辑上是独立的,它可以被改变;引用必须在一开始就要被初始化,而且其引用的对象在整个生命周期内是不能被改变的指针传递参数本质上是值传递的方式,它所传递的是一个地址值,对指针传递参数的改变不会影响到相关的变量;对原创 2015-12-03 17:00:14 · 484 阅读 · 0 评论 -
编程技巧的零散学习
1、不使用if/:?/switch及其他判断语句如何找出两个int型变量中的最大值和最小值?int max=((a+b)+abs(a-b))/2;int min=((a+b)-abs(a-b))/2;2、比较运算符(> >= < <=)运算顺序是从左往右,赋值运算符运算顺序从右向左3、如何使用一条语句实现x是否为2的若干次幂的判断? 如果一个数为2的若干次幂,则其二进制的最高位肯定为1,其他位为原创 2015-12-18 11:54:44 · 503 阅读 · 0 评论 -
C++函数传递参数的方式
1、值传递 当进行值传递时,就是将实参的值复制到形参中,而实参和形参不是在同一个存储单元,所以函数调用结束后,实参的值不会发生改变。#include<iostream>using namespace std;void swap(int a,int b){ int temp; temp=a; a=b; b=temp; cout<<a<原创 2015-12-13 15:47:24 · 480 阅读 · 0 评论 -
一些常见的易于混淆的概念
一、函数指针与指针函数的区别 函数指针是指指向函数的指针变量,其本质是一个指针变量,表示的是一个指针,它指向的是一个函数。 例如:int (*pf)(int x),它的意思是pf=func,将func函数的首地址赋给指针指针函数是指带指针的函数,本质上是一个函数,函数的返回类型是某一类型的指针。 例如:int *f(x,y),声明一个函数f(x,y),函数的返回类型是指向int的指针二、数组指原创 2015-12-13 15:13:21 · 711 阅读 · 0 评论 -
重载与覆盖的区别
1、重载 重载是指函数不同的参数表(参数的类型、个数、顺序),对同名函数的名称做修饰。在同一可访问区域内被声明的几个具有不同参数列表的同名函数,程序会根据不同的参数列来确定具体调用哪个函数。 对于重载函数的调用,在编译期间就已经调用,是静态的,他们的地址在编译期间就绑定了与多态无关。注意,重载不关心函数的返回类型。 成员函数被重载的特征如下:(1)相同的范围(在同一个类中) (2)函数名字原创 2015-12-13 17:14:05 · 613 阅读 · 0 评论 -
什么是可重入函数?
可重入函数是指能够被多个线程“同时”调用的函数,并且能保证函数结果正确性的函数。 在C语言中编写可重入函数时,尽量不要使用全局变量或静态变量,如果使用了全局变量或静态变量,就需要特别注意对这类变量访问的互斥。一般采用以下几种措施来保证函数的可重入性:信号量机制、关调度机制、关中断机制等方式。 需要注意的是,不要调用不可重入的函数,当调用了不可重入的函数时,会使该函数也变成为不可重入的函数。一般驱原创 2015-12-13 17:39:00 · 1136 阅读 · 0 评论 -
不使用流程控制语言,如何打印出1~1000的整数?
一般有两种不同的方法 1、采用构造函数与静态构造变量结合的方法实现 首先在类中定义一个静态成员变量,然后在构造函数里面打印该静态变量的值,并对静态变量进行自增操作#include<stdio.h>struct print{ static int a; print() { printf("%d\n",print::a);原创 2015-12-13 20:43:42 · 743 阅读 · 0 评论 -
有关变量的知识点学习
1、全局变量和静态变量的异同 全局变量的作用域是整个程序,它只需在一个源文件中定义,就可以作用于所有的源文件,其他不包含全局变量定义的源文件需要用extern关键字再次声明这个全局变量。若某一个局部变量重新定义了这个全局变量,则全局变量作用域是除了这个局部外的整个程序,它的生命期与整个程序的生命期一样长。全局变量、静态全局变量、静态局部变量都在静态存储区分配空间,生命期与程序生命期相同,不同原创 2015-12-14 10:11:49 · 593 阅读 · 0 评论 -
不使用C/C++字符串数据库函数,如何自行编写strcpy()函数?
char* strcpy(char *strDest,const char *strSrc){ assert((strDest!=NULL)&&(strSrc!=NULL)); if(strDest==strSrc) return strDest; char *address=strDest; while((*strDest++=原创 2015-12-14 10:34:15 · 765 阅读 · 0 评论 -
如何判断一段程序是由C编译程序还是C++编译程序编译的?
如果编译器在编译cpp文件,那么 _cplusplus就会被定义,如果是一个C文件被编译,那么 _STDC_就会被定义,_STDC_是预定义宏,当它被定义后,编译器将按照ANSIC标准来编译C语言程序。 所以,可以采用下列程序示例判断:#include<stdio.h>#ifdef _cplusplus#define USING_C 0#else#define USING_C 1#endi原创 2015-12-14 17:46:51 · 7195 阅读 · 4 评论 -
编译型语言和解释型语言的区别
编译型语言:编译是指在应用源程序执行之前,将程序源代码“翻译”成目标代码(机器语言),其目标程序可以脱离其语言环境独立执行,使用方便效率高。但应用程序一旦需要修改,就必须下修改源代码,再重新编译生成新的目标文件(*.obj)才能执行,只有目标文件而没有源代码,修改很不方便。C、C++就是编译型语言。解释型语言: 解释型语言的实现中,翻译器并不产生目标机器代码,而是产生易于执行的中间代码。用解释型语原创 2015-12-14 12:03:52 · 467 阅读 · 0 评论 -
自定义内存复制函数memcpy()
memcpy是C语言中的内存复制函数,它的目的是将src指向地址为起始地址的连续n个字节的数据复制到以dest所指向地址为其实地址的空间内,函数返回指向destin的指针。需要注意的是src与dest所指内存区域不能重叠。与strcpy相比,memcpy遇到’\0’不结束,而且一定会复制完n个字节。只要保证src开始有n字节的有效数据,dest开始有n字节内存空间就行。如果目标数组本身已有数据,执行原创 2015-12-14 11:46:26 · 3728 阅读 · 0 评论 -
const的作用
const可用于修饰常亮、常数组、常对象、常指针、常引用,以及函数的常参数、函数的返回值、类的成员函数、在另一连接文件中用用const常量等。 主要有以下作用: (1)定义const常量,具有不可变性 (2)方便进行类型检查 (3)方便进行参数的调整或修改 (4)保护被修饰的东西,防止意外的修改,增强了程序的健壮性 (5)为函数重载提供参考 (6)节省空间。原创 2015-11-27 18:17:23 · 518 阅读 · 0 评论 -
static(静态)变量的作用、初始化特点以及类中静态数据成员的特点
1.static变量有什么作用呢? 在函数体内,值维持不变,具有“记忆”功能; 在模块内(但在函数体外),不能被模块外的其他函数访问; 只在一个源文件中有效,不能被其他源文件使用。2.在C++中,类内数据成员声明前加上static就变成了静态数据成员#include <stdio.h>int main(){ printf("hello, world!\n")原创 2015-11-27 13:23:58 · 3915 阅读 · 0 评论 -
volatile在程序设计中有什么作用?
被volatile类型定义的变量,系统每次用到它时都是直接从对应的内存中提取,而不会利用cache(指缓存SRAM(快速缓冲存储区))中的保存在寄存器里的备份,以适应它未知何时会发生的变化。一个定义为volatile的变量是说这个变量可能会被意想不到的改变,这样编译器就不会去假设这个变量的值了。原创 2015-11-27 21:28:57 · 508 阅读 · 0 评论 -
面向对象
虽然有很多知识点心里是知道的,但是往往很多时候不能准确描述,或”只能意会“,所以对于基础概念的准确描述是十分必要的。1、面向对象与面向过称有什么区别? 面向对象是把数据及对数据的操作方法放在一起,作为一个相互依存的整体,即对象。对同类对象抽象出其共性,即类,类中的大多数数据,只能被本类的方法进行处理。面向过程是一种以事件为中心的开发方法,就是自顶向下顺序执行,逐步求精,其程序结构是按功能原创 2015-12-14 18:14:25 · 392 阅读 · 0 评论 -
C++能设计实现一个不能被继承的类吗
template<typename T>class MakeFinal{ firend T; private: MakeFinal(); ~MakeFinal(); };class FinalClass2:virtual public MakeFinal<FinalClass2>{ public:原创 2015-12-15 20:58:16 · 293 阅读 · 0 评论 -
今天零碎学习的小知识点
1.枚举变量的值如何计算? 在枚举中,某个枚举变量的值默认为前一个变量的值加1,如果第一个枚举变量没有赋值,则默认为0。 如:enum{a,b=5,c,d=4,e} 则实际上是a=0,b=5,c=6,d=4,e=5 从这个例子中可以看出枚举变量值是可以重复的。2.字符数组与字符指针的区别 看下面一个例子: const char str1[]=”abc”; const char str原创 2015-11-30 22:51:47 · 632 阅读 · 0 评论 -
虚函数
虚函数是面向对象编程函数的一种特定形态,是C++用于实现多态的一种有效机制。1、什么是虚函数? 指向基类的指针在操作它的多态类对象时,会根据不同的类对象调用其相应的函数,这个函数就是虚函数,虚函数用virtual修饰函数名。虚函数的作用是在程序的运行阶段动态地选择合适的成员函数。在派生类中重新定义的函数应与虚函数具有相同的形参个数和形参类型,(参数类型的顺序也要一致),以实现统一的接口。如果在派生原创 2015-12-17 22:37:05 · 2931 阅读 · 0 评论 -
为什么const对象只能调用const成员函数,而不能调用非const成员函数?
参考:http://www.cnblogs.com/cplinux/articles/5553716.html在c++中,我们可以用const来定义一个const对象,const对象是不可以调用类中的非const成员函数,这是为什么呢?下面是我总结的一些原理。假设有一个类,名字为test代码如下: 1 class test{2 int i;3 pub转载 2016-10-07 11:49:26 · 5269 阅读 · 1 评论