C/C++
文章平均质量分 64
Lynn-Zhang
...
展开
-
memset函数源码分析
void *memset(void *s, int ch, size_t n);作用:将s所指向的某一块内存中的每个字节的内容全部设置为ch指定的ASCII值, 块的大小由第三个参数指定,这个函数通常为新申请的内存做初始化工作。不知道有没有像我一样把memset当作万能的初始化工具,例如:int arr[n];memset(arr,1,n*sizeof(int));这样得到的arr数组一定不是全转载 2016-06-05 10:12:37 · 791 阅读 · 0 评论 -
memset函数源码实现
void * memset(void *dst, int val, size_t count)将dst所指向的某一块内存中的前count个 字节的内容全部设置为val指定的ASCII值, 第一个值为指定的内存地址,块的大小由第三个参数指定,这个函数通常为新申请的内存做初始化工作, 其返回值为指向s的指针。简单来说就是把dst所指内存区域的前count个字节设置为val。返回指向dst的指针。#in原创 2016-06-05 10:12:35 · 1740 阅读 · 0 评论 -
求数组长度sizeof
当数组当作参数传递时,它就退化成指针了,要求数组长度的话,可以在main函数内部求得#define _CRT_SECURE_NO_WARNINGS 1#include void fun(int arr[], int len){ printf("---%d\n", sizeof(arr)); printf("---%d\n", sizeof(arr[0])); print原创 2016-06-05 10:12:32 · 449 阅读 · 0 评论 -
笔试题: 不使用中间变量求const字符串长度,即实现求字符串长度库函数strlen函数
笔试题:不使用中间变量求const字符串长度,即实现求字符串长度库函数strlen函数。函数接口声明如下:int my_strlen(const char *p);strlen函数实际完成的功能是从代表该字符串的第一个地址开始遍历,直到遇到结束符'\0'。而返回的长度大小不包括'\0'。#include #include //使用中间变量//int my_strlen(const cha原创 2016-06-05 10:12:26 · 667 阅读 · 0 评论 -
strlen和sizeof的区别和联系
一、sizeof sizeof(...)是运算符,在头文件中typedef为unsigned int,其值在编译时即计算好了,参数可以是数组、指针、类型、对象、函数等。 它的功能是:获得保证能容纳实现所建立的最大对象的字节大小。 由于在编译时计算,因此sizeof不能用来返回动态分配的内存空间的大小。实际上,用sizeof来返回类型以及静态分配的对象、结构或数组所占的空间,返回值转载 2016-06-05 10:12:23 · 189 阅读 · 0 评论 -
写一个递归函数DigitSum(n),输入一个非负整数,返回组成它的数字之和
写一个递归函数DigitSum(n),输入一个非负整数,返回组成它的数字之和非负整数n%10会得到它的最低位,不断地模10再除10,会得到它的每一位,把每一位都加起来,最终返回所有数字之和。#include#includeint DigitSum(n){ if (n>0) { return n % 10 + DigitSum(n/10); } return 0;}int ma原创 2016-06-05 10:12:20 · 892 阅读 · 0 评论 -
递归实现 n的k次方
编写一个函数实现n^k,使用递归实现使用尾递归的方法,当传入的参数k等于0的时候返回num;参数不为0是返回num*num(每使用一次递归调用一次函数k都要减去1)递归必须要有限定条件,否则递归会无限制的进行下去,程序会出现溢出的崩溃问题#include#includeint power(int num, int k){ k--; if (k == 0) return num;原创 2016-06-05 10:12:17 · 1115 阅读 · 0 评论 -
冒泡排序
冒泡排序就是把小的元素往前调或者把大的元素往后调冒泡排序算法的运作如下:比较相邻的元素。如果第一个比第二个大,就交换他们两个。对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对。在这一点,最后的元素应该会是最大的数,针对所有的元素重复以上的步骤,除了最后一个。也就是把数组中最小的那个往上冒,冒的过程就是和他相邻的元素交换。这个冒的过程就是内循环。经过了一个冒的过程,可以使一个最小的元素冒出原创 2016-06-05 10:12:14 · 235 阅读 · 0 评论 -
递归实现 参数字符串中的字符反向排列
编写一个函数reverse_string(char * string)(递归实现)实现:将参数字符串中的字符反向排列。要求:不能使用C函数库中的字符串操作函数。如果原字符串是"abcdef",将它用递归的方式翻转成"fedcba";则原数组内存的是 "abcdef\0"调用函数:先将字符a保存起来,将f换到a的位置,再将原f的位置置为"\0"调用函数:指针向前走一个位置,传给函数的参数字符串变为转载 2016-06-05 10:12:09 · 326 阅读 · 0 评论 -
__FILE__ __DATE__ __TIME__ __LINE__
ANSI C标准中有几个标准预定义宏:__FILE__ __DATE__ __TIME___ __LINE__ 等__LINE__:在源代码中插入当前源代码行号;__FILE__:在源文件中插入当前源文件名;__DATE__:在源文件中插入当前的编译日期__TIME__:在源文件中插入当前编译时间;__STDC__:当要求程序严格遵循ANSI C标准时该标识被赋值为1;__c转载 2016-06-05 10:12:06 · 330 阅读 · 0 评论 -
宏、函数、宏和函数的区别
先说宏和函数的区别:1. 宏做的是简单的字符串替换(注意是字符串的替换,不是其他类型参数的替换),而函数的参数的传递,参数是有数据类型的,可以是各种各样的类型.2. 宏的参数替换是不经计算而直接处理的,而函数调用是将实参的值传递给形参,既然说是值,自然是计算得来的.3. 宏在编译之前进行,即先用宏体替换宏名,然后再编译的,而函数显然是编译之后,在执行时,才调用的.因此,宏占用的是编译的时间,而函数转载 2016-06-05 10:12:03 · 360 阅读 · 0 评论 -
assert用法
我一直以为assert仅仅是个报错函数,事实上,它居然是个宏,并且作用并非“报错”。 在经过对其进行一定了解之后,对其作用及用法有了一定的了解,assert()的用法像是一种“契约式编程”,在我的理解中,其表达的意思就是,程序在我的假设条件下,能够正常良好的运作,其实就相当于一个if语句:if(假设成立){ 程序正常运行;}else{ 报错&&终止程序!(避免由程序转载 2016-06-05 10:12:00 · 241 阅读 · 0 评论 -
折半查找(二分查找)
折半查找法是效率较高的一种查找方法。①假设有已经按照从小到大的顺序排列好的10个整数a0~a9,要查找的数是Key,其基本思想是: 查找数据的范围下限为 left=1,上限为 right=9,求中点 mid=(left+right)/2,用 Key 与中点元素mid; 比较,若 Key 等于 mid,即找到,停止查找;②否则,若 Key 大于mid ,替换下限 left=mid+1,到原创 2016-06-05 10:11:57 · 455 阅读 · 0 评论 -
printf函数源码实现
#include #include //va_start(arg,format),初始化参数指针arg,将函数参数format右边第一个参数地址赋值给arg//format必须是一个参数的指针,所以,此种类型函数至少要有一个普通的参数, //从而提供给va_start ,这样va_start才能找到可变参数在栈上的位置。 //va_arg(arg,char),获得arg指向参数的值,原创 2016-06-05 10:12:40 · 27093 阅读 · 6 评论 -
顺序表的静态存储
顺序表是在计算机内存中以数组的形式保存的线性表,是指用一组地址连续的存储单元依次存储数据元素的线性结构。1.顺序表的结构体声明#define MAX_SIZE 5 //定义数组的大小typedef int DataType;typedef struct SeqList{ DataType array[MAX_SIZE]; size_t size;}SeqList;2.顺序表原创 2016-06-05 10:12:46 · 464 阅读 · 0 评论 -
程序在内存中的分布
650) this.width=650;" src="http://images2015.cnblogs.com/blog/932784/201604/932784-20160430194004941-1042441876.png" alt="" style="border:0px;" />代码段(.text),也称文本段(Text Segment),存放着程序的机器码和只读数据,可执行指令就是从原创 2016-06-05 10:14:12 · 498 阅读 · 0 评论 -
菲波那切数列
650) this.width=650;" src="http://s3.51cto.com/wyfs02/M02/7E/F3/wKioL1cN-Geik7rBAAAIj9YuLYs357.png" title="QQ图片20160413154025.png" alt="wKioL1cN-Geik7rBAAAIj9YuLYs357.png" />//递归写法long long Fibonacci原创 2016-06-05 10:14:01 · 815 阅读 · 0 评论 -
程序的编译流程
程序的基本流程如图:650) this.width=650;" src="http://s1.51cto.com/wyfs02/M02/7E/89/wKioL1cDsP_goUwlAAAlcbFkNbs906.png" title="Image.png" alt="wKioL1cDsP_goUwlAAAlcbFkNbs906.png" />1. 预处理预处理相当于根据预处理指令组装新的C/C++程原创 2016-06-05 10:13:49 · 258 阅读 · 0 评论 -
模板函数
模板是C++中泛型编程的基础,是C++语言的一个重要特性。利用模板机制可以显著减少冗余信息,节约程序代码。 模板函数,实际上就是建立一个通用的函数,函数的参数类型和返回类型不具体指定,利用虚拟的类型来代替,在编译调用模板函数时,编译器会根据传递的参数自动推演出模板形参的类型,并自动生成相应的代码。//模板的声明格式:template 返回类型 函数名(模板形参表){ ...(函数原创 2016-06-05 10:13:40 · 576 阅读 · 0 评论 -
memcpy与memmove
函数原型:void* memcpy(void *dst,void const *src,size_t count)void* memmove(void *dst,void const *src,size_t count)头文件:#include字符串由"\0"结尾,所以字符串内部不能包含任何'\0'字符('\0'的ASCII值为0),否则我们将读不到'\0'后的字符内容。但是,非字符串内部包含零原创 2016-06-05 10:13:38 · 292 阅读 · 0 评论 -
比较分析与数组相关的sizeof和strlen
// 形如:int a[]={1,2,3,4,5};char name[]="abcdef";无论是整型数组还是字符数组,数组名作为右值的时候都代表数组首元素的首地址。数组发生降级(数组名退化为数组首元素的地址)的情况:数组传参、数组名参与运算数组名不会发生降级的情况:sizeof(数组名)、取地址数组名(取到的是整个数组的地址而不是首元素的地址)(以下结果都经过VS2013验证)我们先来定义原创 2016-06-05 10:13:35 · 225 阅读 · 0 评论 -
深拷贝的现代写法
650) this.width=650;" src="http://s2.51cto.com/wyfs02/M00/7D/FD/wKioL1b0wXzBjJphAABE5Xm1wLU459.png" title="Image.png" alt="wKioL1b0wXzBjJphAABE5Xm1wLU459.png" />#includeusing namespace std;class St原创 2016-06-05 10:13:20 · 324 阅读 · 0 评论 -
深拷贝的传统写法
650) this.width=650;" src="http://s2.51cto.com/wyfs02/M00/7D/FD/wKioL1b0wHTQP_TZAAA3oYkk79E281.png" title="Image.png" alt="wKioL1b0wHTQP_TZAAA3oYkk79E281.png" />650) this.width=650;" src="http://s2.51原创 2016-06-05 10:13:17 · 366 阅读 · 0 评论 -
【笔试题】result变量的输出结果是多少?
#includeusing namespace std;int i = 1;class MyCls{public: MyCls() :m_nFor(m_nThd) , m_nSec(i++) ,m_nFir(i++) ,m_nThd(i++) { m_nThd = i; } void echo() { cout << "result:" << m_nF原创 2016-06-05 10:13:06 · 724 阅读 · 0 评论 -
_CRT_SECURE_NO_WARNINGS
在编程的过程中我们常常会遇到一些过时或者不安全的函数举一个简单的例子:650) this.width=650;" src="http://s1.51cto.com/wyfs02/M01/7C/CF/wKioL1bYPE3xYyi8AAAg6jCwIdw541.png" title="QQ图片20160303212714.png" alt="wKioL1bYPE3xYyi8AAAg6jCwIdw54原创 2016-06-05 10:13:03 · 476 阅读 · 0 评论 -
C++实现 复数类
#define _CRT_SECURE_NO_WARNINGS 1#includeusing namespace std;//实现复数类的基本成员函数//实现复数之间比较大小//实现复数的四则运算 /* 复数加法:复数z = a + bi(a, b为实数)当b = 0时, z为实数, 可以比较大小;当b不为零时, z为虚数, (a = 0时为纯虚数), 不能比较大小.*原创 2016-06-05 10:12:54 · 608 阅读 · 0 评论 -
C++实现日期类
VS2013#define _CRT_SECURE_NO_WARNINGS 1#include#include using namespace std;//在实现日期之间的运算之前,要先进行日期是否非法的检查//实现日期间大小的比较//计算两个日期间相差的天数//计算一个日期加或减上day天后的日期class Date{public: Date(int year,int原创 2016-06-05 10:12:51 · 242 阅读 · 0 评论 -
位运算小结(按位与、按位或、按位异或、取反、左移、右移)
位运算不管是在Java语言,还是在C语言中,或者其他语言,都是经常会用到的,所以本文也就不固定以某种语言来举例子了,原始点就从0、1开始。位运算主要包括按位与(&)、按位或(|)、按位异或(^)、取反(~)、左移(>)这几种,其中除了取反(~)以外,其他的都是二目运算符,即要求运算符左右两侧均有一个运算量。1、补码在总结按位运算前,有必要先介绍下补码的知识,我们知道当将一个十进制正整数转换为二进制转载 2016-06-05 10:11:54 · 785 阅读 · 0 评论 -
C和C++语言中基本的数据类型
1、C和C++语言中基本的数据类型有:字符型(char),整形(short, int, long), 浮点型(float, double) 650) this.width=650;" src="http://s3.51cto.com/wyfs02/M00/74/D9/wKioL1YsalyTbfyfAACGPqK3fW0261.jpg" title="360反馈意见截图16转载 2016-06-05 10:11:51 · 340 阅读 · 0 评论 -
C语言 实现一个函数,判断一个数是不是素数
#define _CRT_SECURE_NO_WARNINGS 1#include #includeint prime(num){ int i; for (i = 2; i < num / 2; i++) { if (num%i == 0) return 0; else return 1; }}int main(){ int num; int ret原创 2016-06-05 10:11:48 · 1109 阅读 · 0 评论 -
C语言实现单链表
链表结构:650) this.width=650;" src="http://s2.51cto.com/wyfs02/M00/7E/D6/wKiom1cJ9Qqh3PaNAAANce2FK0A214.png" title="QQ图片20160410143950.png" alt="wKiom1cJ9Qqh3PaNAAANce2FK0A214.png" />SList.h#pragma once原创 2016-06-05 10:13:55 · 309 阅读 · 0 评论 -
new的越界访问
今天敲代码的时候发现了一个BUG和大家分享一下,希望大家下次不要犯和我一样的错误。如果犯了和我一样的错,也能知道自己错在哪里! 函数如下:(斐波那契数列的实现)long long FibonacciSeq( int n){ long long *fib=new long long[n+1]; fib[0] = 0; fib[1] = 1; for原创 2016-05-24 11:49:43 · 435 阅读 · 0 评论 -
分离式编译
分离式编译是指一个完整的程序或项目由若干个源文件共同实现,每个源文件单独编译生成目标文件,最后将该项目中的所有目标文件连接成一个单一的可执行文件的过程。 每个.cpp源文件经过预处理,它所包含的.h文件的代码都会被展开到其中。再经过编译器的编译汇编等过程,将该.cpp文件转变为.obj文件,这是此文件已经变为二进制文件,本身包含的就是二进制代码。这时,该文件还不一定能够执行,因为并不原创 2016-04-11 09:45:41 · 2324 阅读 · 1 评论 -
C/C++程序编译流程
程序的基本流程如图:1. 预处理预处理相当于根据预处理指令组装新的C/C++程序。经过预处理,会产生一个没有宏定义,没有条件编译指令,没有特殊符号的输出文件,这个文件的含义同原本的文件无异,只是内容上有所不同。读取C/C++源程序,对其中的伪指令(以#开头的指令)进行处理 ①将所有的“#define”删除,并且展开所有的宏定义原创 2016-04-11 08:58:18 · 594 阅读 · 0 评论 -
strcpy函数的实现
strcpy函数转载 2015-10-25 13:14:02 · 392 阅读 · 0 评论 -
assert
assert宏的原型定义在中,其作用是如果它的条件返回错误,则终止程序执行,原型定义: #include void assert( int expression ); assert的作用是现计算表达式 expression ,如果其值为假(即为0),那么它先向stderr打印一条出错信息, 然后通过调用 abort 来终止程序运行。 编写能正常运行转载 2015-10-24 22:06:52 · 493 阅读 · 0 评论 -
C和C++语言中基本的数据类型
1、C和C++语言中基本的数据类型有:字符型(char),整型(short, int, long), 浮点型(float, double) 同时字符型和整型还可以继续分为带符号的和不带符号的,默认情况下都是带符号的,如果想使用不带符号的,则使用时带上 unsigned说明即可,如果是带符号的,那么最高位将表示符号位,最高位为0表示为正数,最高位为1表示为负数,因此转载 2015-10-25 10:05:42 · 3706 阅读 · 0 评论 -
C语言 折半查找(二分查找)
折半查找原创 2015-10-25 10:03:10 · 1259 阅读 · 1 评论 -
C语言 求数组长度
C语言 数组长度原创 2015-10-24 15:42:25 · 1035 阅读 · 0 评论 -
C语言 判断花括号是否成对出现
C语言 判断花括号是否成对出现原创 2015-10-24 16:50:24 · 1343 阅读 · 2 评论