C知识点
观赏
github:https://github.com/happyxiaotao
展开
-
细数变量所具有的属性
我们知道,变量的一些属性决定了一个变量的“可视性”(它可以在什么地方使用)和“生命期”(它的值将保存多久),对于我们编写程序非常重要。受此启发,最近总结一下变量所应具有的属性,特别总结记录下来。1,名字属性2,类型属性3,值属性4,作用域5,链接属性6,存储类型(包含生命期)1,名字属性所谓名字,其实就是标识符(identity),它由大小写字母、数字和原创 2017-04-03 01:09:21 · 1752 阅读 · 0 评论 -
模拟实现printf函数
在学习C语言的时候,使用最多的就是printf函数了,常常用,却没有认真的思考过printf函数是如何实现的。查了查msdc后,有了点心得,连忙记录下来。呈上msdn上printf函数的主要相关信息:功能:Print formatted output to the standard output stream.格式化输出打印到标准输出流函数原型:int printf原创 2016-11-10 09:34:08 · 2582 阅读 · 2 评论 -
汉诺塔之谜
汉诺塔:汉诺塔(又称河内塔)问题是源于印度一个古老传说的益智玩具。大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘。大梵天命令婆罗门把圆盘从下面开始按大小顺序重新摆放在另一根柱子上。并且规定,在小圆盘上不能放大圆盘上面,在三根柱子之间一次只能移动一个圆盘。问题:计算全部摆放完毕后总的移动次数。解析:当只有一个原创 2017-03-13 20:42:20 · 1042 阅读 · 0 评论 -
C语言顺序表的实现
在SeqList.h文件中声明#ifndef _SEQLIST_H_#define _SEQLIST_H_#define MAXSIZE 10typedef int DataType;typedef unsigned int size_t;typedef struct SeqList{ DataType _array[MAXSIZE]; size_t _size;//原创 2017-03-12 11:50:55 · 479 阅读 · 0 评论 -
密码学之仿射加密解密算法
仿射变换的加密解密分别是:c = Ea,b(m) ≡ a, + b(mod 26)m = Da,b(c) ≡ a^-1(c - b)(mod 26)其中,a,b是密钥,为满足0≤a,b≤25和gcd(a,26)等于1的整数。其中gcd(a,26)表示a和26的最大公因子,gcd(a,26)=1表示a和26是互素的,a^-1表示a的逆元,即a^-1*a ≡ 1mod26。原创 2017-03-09 15:38:04 · 44900 阅读 · 10 评论 -
青蛙变态跳台阶
其实和青蛙跳台阶类似的思想。n = 0, 0-> f(0)n = 1, (1)-> f(1) n = 2, (2, 1+1) ->f(0)+f(1) n = 3, (3, 2+1, 1+2)-> f(0)+f(1)+f(2)n = 4, (4, 3+1, 2+2, 1+3)-> f(0)+f(1)+f(2)+f(3)n = n, (n,n-1+1, n-2+2, ...原创 2017-02-28 22:41:12 · 461 阅读 · 0 评论 -
斐波那契数列
问题描述:大家都知道斐波那契数列,现在要求输入一个整数n,请你输出斐波那契数列的第n项(n首先知道斐波那契数列的简介:斐波那契数列(Fibonacci sequence),又称黄金分割数列、因数学家列昂纳多·斐波那契(Leonardoda Fibonacci)以兔子繁殖为例子而引入,故又称为“兔子数列”,指的是这样一个数列:1、1、2、3、5、8、13、21、34、……在数学上,斐波纳契数原创 2017-02-28 21:35:20 · 329 阅读 · 0 评论 -
青蛙跳台阶
题目描述:一只青蛙一次可以跳上1级台阶,也可以跳上2级。求该青蛙跳上一个n级的台阶总共有多少种跳法?因为一次只能跳一个或两个台阶。所以,n n = 1,只能跳一个台阶。f(1) = 1;n = 2, 两次跳一个台阶,或一次跳两个台阶。f(2) = 2; n = 3, 只能从第2个台阶或第一个台阶跳上来。判断f(2)和f(1)即可获得f(3)。f(3) = f(2)+f(1)原创 2017-02-28 19:31:32 · 276 阅读 · 0 评论 -
求Sn=a+aa+aaa+aaaa+aaaaa+...的前n项之和
求Sn=a+aa+aaa+aaaa+aaaaa+...的前n项之和,其中a是一个数字,例如:2+22+222+2222+22222代码:#include #include #include int main(){ int value = 2; int n = 5; int Sn = 0; int i = 0; printf("Sn = "); for(i = 0原创 2016-10-11 15:01:21 · 4578 阅读 · 0 评论 -
程序的实现过程(编译、链接、执行)
在ANSI C的任何一种实现中,存在两个不同的环境第1种是翻译环境,在这个环境中源代码被转换为可执行的机器指令。第2种是执行环境,它用于实际执行代码。标准明确说明:这两种环境不必位于同一台机器上。例如,交叉编译器就是在同一台机器上运行,但它所产生的可执行代码运行于不同类型的机器上。操作系统也是这样。在翻译阶段,程序实现过程如下图:翻译阶段的两个步骤:原创 2017-03-14 17:48:14 · 4935 阅读 · 0 评论 -
数据存储的大小端问题
为什么会有大小端模式之分呢?这是因为在计算机系统中,我们是以字节为单位的,每个地址单元都对应着一个字节,一个字节为 8bit。但是在C语言中除了8bit的char之外,还有16bit的short型,32bit的long型(要看具体的编译器),另外,对于位数大于 8位的处理器,例如16位或者32位的处理器,由于寄存器宽度大于一个字节,那么必然存在着一个如何将多个字节安排的问题。因此就导致了大原创 2017-03-14 19:47:27 · 1651 阅读 · 0 评论 -
指针、数组、字符串(二)两句话分清数组和指针
什么是数组? 数组是在程序设计中,为了处理方便, 把具有相同类型的若干变量按有序的形式组织起来的一种形式。这些按序排列的同类数据元素的集合称为数组。 有限个类型相同的变量的集合命名即是数组名。 组成数组的各个变量称为数组的分量,也称为数组的元素,有时也称为下标变量。 用于区分数组的各个元素的数字编号称为下标。数组分类在C语言中, 数组属于构造数据类型。原创 2017-03-26 03:15:23 · 488 阅读 · 0 评论 -
详解static与extern的区别
我们必须知道:C/C++声明的变量默认是内部链接,函数默认是外部链接。关键字extern和static用于在声明中,修改标识符的链接属性(链接类型表明了一个标识符的可见性)。这里主要就是比较两者对于标识符在链接属性方面的影响。static(只讨论其对变量或函数实体链接属性的影响)1,如果某个声明在正常情况下具有external链接属性,在它前面加上static关键字可以原创 2017-04-02 23:44:21 · 2705 阅读 · 0 评论 -
C顺序表及其功能的实现
顺序表;是在计算机内存中以数组的形式保存的线性表,是指用一组地址连续的存储单元依次存储数据元素的线性结构。线性表采用顺序存储的方式存储就称之为顺序表。顺序表是将表中的结点依次存放在计算机内存中一组地址连续的存储单元中。顺序表的相关声明及其定义#define MAXSIZE 10typedef int DataType;typedef unsigned int s原创 2017-03-26 03:00:16 · 475 阅读 · 0 评论 -
函数指针的巧妙应用
对于一个函数而言,函数名是指向函数第一条指令的常量指针。而编译器要做的就是在程序编译之后,为每个函数分配一个首地址,即该函数第一条指令的地址。一般情况下,我们可以用一个指针来保存这个地址,而这个指针就是函数指针,该指针可以看作是它指向函数的别名,所以我们可以用该指针来调用这个函数。下面通过一个例子,来体会函数指针的妙用。对于C语言,由于没有C++中的函数重载,模板等代码可以复用原创 2017-03-26 02:32:35 · 1818 阅读 · 0 评论 -
assert用法分析
我一直以为assert仅仅是个报错函数,事实上,它居然是个宏,并且作用并非“报错”。 在经过对其进行一定了解之后,对其作用及用法有了一定的了解,assert()的用法像是一种“契约式编程”,在我的理解中,其表达的意思就是,程序在我的假设条件下,能够正常良好的运作,其实就相当于一个if语句:if(假设成立){ 程序正常运行;}else{ 报错&&终止程序!(避免由转载 2017-03-16 02:18:05 · 375 阅读 · 0 评论 -
密码学之大数乘法
大数相乘,就是指数字比较大,相乘的结果超出了基本类型的表示范围,通常将其保存在一个字符串中来计算。所以这样的数不能够直接做乘法运算。在学习密码学的过程中,当从用户界面接受的数据字符串CString无法使用atoi或atol转化为对应的数字时,就需要使用大数乘法。原创 2017-03-13 13:15:27 · 2043 阅读 · 0 评论 -
指针、数组、字符串(一)指针的概念
什么是指针? 我们知道,可执行程序是由指令、数据和地址组成的。当CPU访问内存单元时,不论是读取还是写入,首先必须把内存单元的地址加载到地址总线(AB)上,同时将内存电路的“读写控制”设为有效,然后内存单元中的数据就通过数据总线(DB)“流”向了接收寄存器中,或者结果寄存器中的值“流”向了目标内存单元中。这就是一个“内存读写周期”。内存单元的地址就是指针的值。指针是变量吗?原创 2017-03-15 14:27:56 · 928 阅读 · 2 评论 -
模拟用户登录情景
模拟用户登录情景,并且只能登录三次。只允许输入三次密码,如果密码正确则提示登录成,如果三次均输入错误,则退出程序。代码:#include #include #include int main(){ char passwd[] = "shijuntao"; int len = strlen(passwd); int i =0; printf("请输入登录密码:\n")原创 2016-10-11 14:58:58 · 447 阅读 · 0 评论 -
一直接收键盘字符,输出对应的字符
实现程序可以一直接收键盘字符,如果是小写字符就输出对应的大写字符,如果接收的是大写字符,就输出对应的小写字符,如果是数字不输出.#include #include int main(){ int tmp = 0; while((tmp = getchar()) != EOF) { if(tmp >= 48 && tmp <= 57) continue; else原创 2016-10-11 14:54:32 · 366 阅读 · 0 评论 -
常用汇编伪指令
DW 定义字(2字节).PROC 定义过程.ENDP 过程结束.SEGMENT 定义段. ASSUME 建立段寄存器寻址.ENDS 段结束.END 程序结束.原创 2017-03-11 23:25:29 · 439 阅读 · 0 评论 -
数值的整数次方
问题描述:给定一个double类型的浮点数base和int类型的整数exponent。求base的exponent次方。解析:主要考察对于base在double类型下与0的判断,exponent的正负情况。double Power(double base, int exponent) { if ((1E-16 >= base) && (-1E-16 <= base)) return原创 2017-03-04 17:32:51 · 275 阅读 · 0 评论 -
二进制中1的个数
问题描述:输入一个整数,输出该数二进制表示中1的个数。其中负数用补码表示。解析:对于整数在计算机中的存储不太了解的可以查看我的博客:http://blog.csdn.net/qq_35524916/article/details/52727080利用 n&(n-1)可以将n中二进制表示的最左边的1变为0。可以通过计算将1变为0个次数,统计1的个数。int numberOf1(int原创 2017-03-04 17:24:04 · 192 阅读 · 0 评论 -
矩形覆盖问题
问题描述:我们可以用2*1的小矩形横着或者竖着去覆盖更大的矩形。请问用n个2*1的小矩形无重叠地覆盖一个2*n的大矩形,总共有多少种方法?解析:当n = 1时,只有一种方法,竖着放。当n = 2时,有两种,横着放,或者竖着放,当n >= 3时,和斐波那契数列类似。先分为第一步是横着放还是竖着放,然后分别求出各自剩余的未覆盖矩形的覆盖方法。让最中结果相加。int RectCo原创 2017-03-04 17:00:38 · 1841 阅读 · 0 评论 -
atexit简介
atexit()在MSDN中信息所在头文件:函数原型:int atexit( void (__cdecl* func )( void ));返回值:atexit returns 0 if successful, or a nonzero value if an error occursatexit成功返回0,失败返回一个非0值.函数简介:The atexit fun原创 2017-02-20 22:04:01 · 418 阅读 · 0 评论 -
原码,反码,补码
今天突然发现自己对于负数的二进制的表示有点迷糊,吓得赶紧查了查资料,简单整理如下几点:一,对与有符号的数而言1,二进制的最高位是符号位:0表示正数,1表示负数,其余的位代表数值位,表示具体的二进制数值;2,正数的原码,反码,补码都一样;3,负数的反码 = 它的原码符号位不变,其他位取反(0->1,1->0);4,负数的补码 = 它的反码 + 1;5,在计算机运算时,都是以补原创 2016-10-03 10:38:11 · 443 阅读 · 0 评论 -
C语言交换两个整数的值
在学习用C语言交换两个整数的值得时候,有趣的发现了三种不同思路的解法。整理大概如下:#include void swap1(int *a, int *b);void swap2(int *a, int *b);void swap3(int *a, int *b);int main(void){ int a = 10, b = 20; printf("交换前:a = %d, b原创 2016-09-29 23:05:25 · 6743 阅读 · 0 评论 -
演示字符从两边向中间汇聚
演示多个字符从两端移动,向中间汇聚。代码:#include #include #include #include int main(){ char arr[] = "created in China !!"; char temp[32] = {0}; int i = 0; int len = strlen(arr); int right = len-1, left =原创 2016-10-11 14:57:21 · 443 阅读 · 0 评论 -
C语言宏和函数
在C语言编程中,有时会纠结于使用宏还是函数的的情况。原创 2016-11-06 04:02:56 · 333 阅读 · 0 评论 -
替换空格
功能:请实现一个函数,将一个字符串中的空格替换成“%20”。例如,当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20Happy。思路:从后往前替换/*功能:用%20替换空格*/#include #include #include void replaceSpace(char* pstr){ int i = 0; int count =原创 2017-02-27 15:51:17 · 243 阅读 · 0 评论 -
数组、指针、字符串(三)探究字符数组、字符指针和字符串的相互联系
要想正确合理的使用某一项技术,首先要了解清楚的了解它们的概念,做到以不变应万变。字符数组:元素是字符变量的数组,可以修改数组元素的值。字符指针:指向某个字符地址的指针。字符串:存储域静态区,以‘\0’作为结束标志的字符数组,不可以修改字符串内容。下面通过例子来深入探究三者之间的联系#include int main(){ char array1[] = {'H'原创 2017-03-27 23:14:46 · 582 阅读 · 0 评论 -
常用汇编程序转移指令
1,无条件转移指令(长转移)JMP无条件转移指令CALL 过程调用RET/RETF 过程返回2,条件转移指令(短转移,-128到+127的距离内)(当且仅当(SF XOR OF)=1时,OP1JA/JNBE 不小于或不等于时转移.(意思就是大于则就跳)JAE/JNB 大于或等于转移.JB/JNAE 小于转移. JBE/JNA 小于或等于转移. 以上四条,原创 2017-03-11 23:13:21 · 1966 阅读 · 0 评论 -
常用汇编串指令
ds:si 源串段寄存器:源串变址es:di 目标串段寄存器:目标串变址cx 重复次数计数器al/ax 扫描值d标志 0表示重复操作中si和di应自动增量;1表示应自动减量z标志 用来控制扫描或比较操作的结束movs 串传送(movsb 传送字符。movsw传送字)cmps 串比较(cmpsb 比较字符。 cmpsw 比较字)scas 串扫描把al或原创 2017-03-11 23:00:44 · 1934 阅读 · 0 评论 -
常用汇编逻辑运算指令
AND 与运算OR 或运算XOR 异或运算NOT 取反TEST 测试(两操作数作与运算,仅修改标志位,不回送结果)SHL 逻辑左移SAL 算术左移(=shl)SHR 逻辑右移SAR 算术右移(=shr)ROL 循环左移ROR 循环右移RCL 通过进位的循环左移RCR 通过进位的循环右移以上八种移位指令,其移位次数可达255次。移位一次时,可直原创 2017-03-11 22:51:11 · 6702 阅读 · 0 评论 -
常用汇编算术运算指令
add 加法adc 带进位加法inc 加1aaa 加法的ASCII码调整daa 加法的十进制调整sub 减法sbb 带借位减法dec 减1nec 求反(以0减之)cmp 比较(两操作系统做减法,仅修改标志位,不回送结果)aas 减法的ASCII码调整das 减法的十进制调整mul 无符号乘法imul 整数乘法(以上两条结果回送:ah和al(字原创 2017-03-11 17:37:38 · 4050 阅读 · 0 评论 -
常用汇编数据传输指令
一、数据传输指令它们在存储器和寄存器、寄存器和输入输出端口之间传送数据。1,通用数据传送指令mov 传送字或字节movsx 先符号扩展,在传送movzx 先0扩展,再传送push 把字压入堆栈pop 把字弹出堆栈pushA 把ax,cx,dx,bx,sp,bp,si,di依次压入堆栈popA 把di,si,bp,sp,bx,dx,原创 2017-03-11 17:24:35 · 2839 阅读 · 0 评论 -
算术转化和整型提升的奥秘
首先请大家先思考一下3个问题,问题相互之间是有关联的。1,整型字面值是属于整型家族9种中的哪一种呢?2,什么是算术转换?如何转换的?3,什么是整型提升?如何提升的?为什么会有整形提升?下面解答上述问题。1,整型字面值是属于整型家族9种中的哪一种呢?答案取决于字面值时如何书写的。比如在整数字面值后面后面添加字符L或l,可以使这个整数被解释为long整型值,字符U或原创 2017-03-11 08:21:44 · 1003 阅读 · 2 评论 -
详解函数堆栈
任何一个程序通常都包括代码段和数据段,这些代码和数据本身都是静态的。程序要想运行,首先要由操作系统负责为其创建进程,并在进程的虚拟地址空间中为其代码段和数据段建立映射。光有代码段和数据段是不够的,进程在运行过程中还要有其动态环境,其中最重要的就是堆栈。图3所示为Linux下进程的地址空间布局:图3 Linux下进程地址空间的布局 首先,execve(2)会负责为进程代码段和数据段建立映射,真正将代转载 2017-03-28 00:28:45 · 3026 阅读 · 0 评论 -
博客之路开篇
大家好,新人刚到,希望各路大神多多指教哈!第一篇博客,我就谈谈为什么要开博客以及自己对自己未来的一些初步规划来提醒自我之所以开博客主要是为了记录并展示自己在C/C++或linux学习实践中的一些心得,以此来提高己。自己的能力。对未来的规划:现阶段编程目标是先把C语言精通;计划根据学习路线来踏实不浮躁的学习,打好基础。虽然现在课程压力变大,但是能否坚持自己的梦原创 2016-09-23 21:22:47 · 272 阅读 · 0 评论