摘要: 该函数的原型如下:void rotate(void *front, void *middle, void *end) front、middle、end实际上是某个已经排好序的指针,并且指向数组的不同边界. 我们需要的的实现场景为假如一个有50个整型元素的数组,我们想把前面4个元素移动到数组的末尾.位置如图: 我们可以手动计算出A的字节数以及B的字节数,我们在实现的时候其实根本不用知道数组到底包含多少元素,但是函数仍然会以同样的方式进行字符的轮转.计算代码如下:int frontSize = (char *)middle - (char *)front;int backSize = (... 阅读全文
posted @ 2012-06-14 20:20 ahl5esoft 阅读(750) 评论(0) 推荐(0) 编辑
摘要: 作用域、存储类型示例//默认链接属性,external,存储于静态内存int a = 5;//默认链接属性,其实extern是可以不要的,但是风格上加上关键字是有好处的,存储于静态内存extern int b;//因为加上了static,链接属性从external变为internal,源文件私有,存储于静态内存static int c;//默认链接属性,可以被任何文件调用,但是其他文件必须要有d的原型,如果加上static的话,就会变成源文件私有。对于函数而言代码都是存储在静态内存中的int d (int e){ //局部变量,自动存储类型,存储于堆栈,作用域仅限于该函数,每次函数调用都... 阅读全文
posted @ 2012-06-13 07:09 ahl5esoft 阅读(220) 评论(0) 推荐(0) 编辑
摘要: 枚举类型 枚举类型就是指它的值为符号常量而不是字面值类型.符号名被当作整型常量处理,声明为枚举类型的变量实际上是整数类型。因此可以将任何整型变量赋值给枚举变量,但是应该避免这种方式使用枚举类型,因为把枚举变量同整数无差别的混合在一起使用,会削弱它们值的含义。浮点类型 浮点家族包括float、double和long double类型。ANSI标准仅仅规定long double至少和double一样,而double至少了float一样长,而读点类型至少能容容纳从10-37到1037之间的任何值。浮点数子面值默认情况下为double类型。指针 指针指示地址的另一个名字而已,指针变量就是一个其值... 阅读全文
posted @ 2012-06-12 07:25 ahl5esoft 阅读(216) 评论(0) 推荐(0) 编辑
摘要: 本书的开头便给出了2页的源代码,并根据源代码对程序进行了解释、提示以及警告(需要注意以及容易出错的地方)。声明提示 对于需要在不同源文件中使用一些声明,可以在一个单独的文件中编写这些声明,然后用#include把这个文件复制到需要这些生命的源文件中,这样可以使用这些声明的一份拷贝,用不着在许多不同的地方进行的复制,避免了在维护这些代码时出错的可能性。函数scanf警告 1、由于scanf的实现原理,所有标量参数(整型和字符)都必须按地址传递(前面要加上'&'),如果没有这个符号的话,程序时无法正确运行的。 2、需要注意的是格式化的地方,它与函数printf的格式化方式较 阅读全文
posted @ 2012-06-11 07:13 ahl5esoft 阅读(189) 评论(0) 推荐(0) 编辑
摘要: 这是我学习C语言的第一步,每天早上花1个小时学习,做一些练习,并整理一些学习的成果,虽然时间不算很多,但是实实在在的了解了C语言中的一些用法,例如:#include、#define、按位运算等。 特别是按位运算,当初C#学习的时候,偶然间在别人的代码中看到了,当时也不知道怎么搜索这些知识,但是开始学习C语言以后,也让我真正将把这些基础掌握了。 以前经常听别人说作为一个程序员应该学习几种语言,当初以为只要在一种语言专精,也能到达不错的程度,但是开始学习C语言之后,才发现万事开头难,只要自己愿意走出第一步去接触陌生的语言,从语言的语法、函数库到能编码出一些成品之后,对自己当前的语言的理解也... 阅读全文
posted @ 2012-06-10 21:30 ahl5esoft 阅读(236) 评论(0) 推荐(0) 编辑
摘要: 对象和左值 对象是一个命名的存储区域,左值是引用了某个对象的表达式。指针和整数 指针可以加上或减去一个整型表达式。两个指向同一数组中同一类型的对象的指针可以进行减法,其结果被转换为整型。 指针可以转换为整型,但此整型必须足够大;所要求的大小依赖于具体的实现。整型对象可以显示的转换为指针。 指向某一类型的指针可以转换为指向另一类型的指针,但是,如果该指针指向的对象不满足一定的存储对其要求,则结果指针可能会导致地址异常。指向某对象的指针可以转换为一个指向具有更小或相同存储对齐限制的对象的指针。("对齐"概念依赖于具体实现) 指向函数的指针可以转换为指向另一个函数的指针。调用转换 阅读全文
posted @ 2012-06-08 06:53 ahl5esoft 阅读(219) 评论(0) 推荐(0) 编辑
摘要: 格式化输入--scanf 输入函数scanf对应输出函数printf,它在与后者相反的方向上提供相同的转换功能,格式:1 int scanf(char *format, ...); 另外一个输入函数sscanf,它用于从一个字符串(而不是标准输入)中读取字符串,格式:int sscanf(char *string, char *format, arg1, arg2, ...); 它按照格式参数规定的格式扫描字符串string,并把结果分别保存到arg1、arg2、...这些参数中,scanf和sscanf的这些参数必须都是指针.文件访问 在读写一个文件之前,必须通过库函数fopen打开... 阅读全文
posted @ 2012-06-07 06:48 ahl5esoft 阅读(228) 评论(0) 推荐(0) 编辑
摘要: 表查询 算法采用的是散列查询方法(哈希表),将输入的名字转化为一个很小的非负整数,该整数随后会将作为一个指针数组下标.数组的每个元素指向某个链表的表头,链表中的各个块用于描述具有该散列值的名字.如果没有名字散列到该值,则数组元素的值为NULL. 散列函数能是一个数据序列的访问过程更加迅速有效,这样能将数据元素更快的定位到.通常有以下几种方法:1、直接寻址法(H(key) = a + b * key);2、数字分析法;3、平方取中法;4、折叠法;5、随机数法;6、除留余数法.具体的信息可以参考维基百科.类型定义(typedef) C语言通过它来建立新的数据类型名,例如:typedef in... 阅读全文
posted @ 2012-06-06 06:37 ahl5esoft 阅读(233) 评论(0) 推荐(0) 编辑
摘要: 此次为练习实践记录,讲解用纯C模拟一个C++的int类型的stack。 因为在纯C中没有class关键字,也没有public、private,但是有struct,现在已最接近的方式实现,声明如下:1 typedef struct2 {3 int *elements;4 int logicalLen;5 int allocLength;6 } Stack; 在纯C中typedef是必须的,但是在C++中是不必要的。从技术上来讲,以上3个域都是暴露在外的,都是隐含为public的。我们可以将Stack声明为局部变量,编译器知道这种类型占12字节,但是我们不应该直接操... 阅读全文
posted @ 2012-06-05 23:59 ahl5esoft 阅读(1271) 评论(0) 推荐(2) 编辑
摘要: 指向结构的指针 对于指针和数组首先要注意:两个指针之间的加法运算是非法的,但是指针的剑法却是合法的。且对于数组arr而言,&arr[-1]是绝对非法的,对于&arr[n]的间接引用也是非法的。但是C语言的定义保证数组末尾的第一个元素,即&arr[n]的指针算术运算可以正确执行。 千万不要认为结构的长度等于各成员的长度的和。因为不同的对象有着不同的对其要求,所以结构中可能出现未命名的"空穴"(hole)。对于一下结构:1 struct {2 char c;3 int i;4 }; char占一个字符,int占4个字符,该结构可能占用的是8个字节而非5个 阅读全文
posted @ 2012-06-05 06:39 ahl5esoft 阅读(193) 评论(0) 推荐(0) 编辑
摘要: 结构基本知识 结构是一个或者多个变量的集合,这些变量可以为不同的类型。ANSI标准在结构方面最主要的变化是定义了结构的赋值操作:拷贝、赋值、传递给函数、函数返回结构类型的值。 结构声明如下:View Code 1 struct point2 {3 int x;4 int y;5 }; 结构也可以跟其他的基本类型声明一样,如:View Code 1 struct {...} x, y, z; 我们可以使用以下的方式进行结构的初始化,如:View Code 1 struct point minPoint = {0, 0};2 //或者3 struct point minPo... 阅读全文
posted @ 2012-06-04 07:03 ahl5esoft 阅读(161) 评论(0) 推荐(0) 编辑
摘要: 指向函数的指针 在C/C++语言中,函数本身不是变量,但可以定义指向函数的指针。这种类型的指针可以被赋值、存放在数组中、传递给函数以及作为函数的返回值等等。由于指向函数的指针还是实践的比较多,书中是以改写快速排序为例子的,现在呢,我们就来编写一个线性排序。 1 int lsearch(void *key, void *base, int n, int elementSize, int(*cmpfn)(void *, void *)) 2 { 3 for(int i = 0; i < n; i++) 4 { 5 void *elementAddress = (c... 阅读全文
posted @ 2012-06-01 07:36 ahl5esoft 阅读(182) 评论(0) 推荐(0) 编辑
摘要: 指向数组的指针 首先我们来看3行代码:1 int *a[10];2 int (*a)[10];3 int a[10]; 3行代码其实还是比较接近的,但是意义却是不一样的。 1、a表示的是由int *类型组成的数组,这个数组的长度为10; 2、a表示的是a是指向由10个int组成的数组类型的指针; 3、a表示的是由10个int组成的数组。 从以上的说明当中,我们可以认为[]比*的优先级要高,因此当类型会先跟[]组合,然后再与*组合。int a[10];int (*pa)[10] = &a; a是一个数组,现在使用&a将数组a的首地址复制给pa,其实&a的数值等于& 阅读全文
posted @ 2012-05-31 09:58 ahl5esoft 阅读(149) 评论(0) 推荐(0) 编辑
摘要: 今天主要学习是关于指针的。 指针与地址 可以是用一元运算符&用于取一个对象的地址,格式为:p = &c,而*则是间接寻址或者间接引用。 *p = *p + 10 or *p += 10 表示*p的值增加10,但是在是用如: (*p)++ 时要注意,如果没有括号,则是对p进行加1运算,而不是对p指向的对象进行加1运算。 指针与数组 声明: int a[10]; int *p; p = &a[0]; 表示指针pa指向数组a的第0个元素,也就是p的值为数组a[0]的地址。也可以写成如下形式:p = a; 对于数组元素a[i]的引用可以写成*(a+i),C语言在计... 阅读全文
posted @ 2012-05-30 07:43 ahl5esoft 阅读(174) 评论(0) 推荐(0) 编辑
摘要: 今天主要学习到的是静态变量(static)、寄存器变量(register)、初始化、递归、预处理器。 比较容易混淆的是关于静态变量的,而静态变量分为:静态局部变量和静态全局变量。 静态局部变量: (1)、静态局部变量在函数内定义 它的生存期为整个源程序,但是其作用域仍与自动变量相同,只能在定义该变量的函数内使用该变量。退出该函数后, 尽管该变量还继续存在,但不能使用它。 (2)、允许对构造类静态局部量赋初值 例如数组,若未赋以初值,则由系统自动赋以0值。 (3)、对基本类型的静态局部变量若在说明时未赋以初值,则系统自动赋予0值。而对自动变量不赋初值,则其值是不定的。 ... 阅读全文
posted @ 2012-05-29 08:02 ahl5esoft 阅读(143) 评论(0) 推荐(0) 编辑
摘要: 每天一点点,不知不觉已经到了第4章了。 首先是对于函数的基础知识的说明,以等同于C#的IndexOf的函数为例子,对于一些C#的程序员,C/C++中的字符串是一个char的数组,但是数组的书写方式也是不一样的,C#中都是类型[],而C/C++中的确实类型 变量名[],虽然一开始都是有点不习惯,但是几次练习实践后,还是可以适应的。函数的具体实现如下: 1 int strindex(char s[], char t[]) 2 { 3 int i, j, k; 4 5 for( i = 0; '\0' != s[i]; i++) 6 { 7 fo... 阅读全文
posted @ 2012-05-28 21:45 ahl5esoft 阅读(184) 评论(0) 推荐(0) 编辑
摘要: c/c++的控制流跟C#的差不多,分别有if-else、else-if、while、for、do-while、break、continue以及goto. 对于if-else的习题为对于一下折半查找的例子,用while循环语句共执行2次测试,其实可以只用一次,于是要求改写,原代码如下: int binsearch(int x, int v[], int n) { int low, mid, high; low = 0; high = n - 1; while ( low <= high ) { mid = (low+high) / 2; ... 阅读全文
posted @ 2012-05-27 20:58 ahl5esoft 阅读(158) 评论(0) 推荐(0) 编辑
摘要: 这次的章节主要是对于按位运算符的掌握,如:~、&、|、>>、<<,看到这几个运算符,让我想起了以前突然有一次在网上看到一个算法(C#)写的,里面就有很多这样的按位运算符,当时我就懵了,于是便到网上找资料,当时用具体的按位运算符去搜索,没找到什么资料,后来就发了博文,记录了自己一些理解,现在回想起来,终于把这几个问题搞明白了,呵呵。 由于刚刚掌握没多久,怕自己隔段时间就会生疏,于是拿一道练习题来做解析,以后自己再来看便能更好的熟悉起来。 例题:将x中从第p位开始的n个(二进制)位设置为y中最右边的n位的值。 实现: View Code 1 unsigned set 阅读全文
posted @ 2012-05-26 13:20 ahl5esoft 阅读(218) 评论(1) 推荐(0) 编辑
摘要: 可能是因为不是计算机专业出身的原因吧,对于一些类型的取值范围都是模模糊糊的,这次学习c语言又再次温习了一遍,对于有符号无符号的类型,也让我的脑袋一时间都变成了浆糊,long类型的常量以字母l或L结尾,无符号的long类型常量则以ul或UL结尾,后缀为f或者F则为float类型,这里又再次出现了一个以l或L结尾的常量,但是表示的却是浮点类型的long double。 接下来便是关于运算过程中的转换原则,通常都是将“比较窄的“类型转化为”比较宽的“类型,这样可以保证不会因为转型而导致信息丢失,但是如果将”比较宽的“类型转化为”比较窄的“也是可以的,只是会造成信息的丢失,会将超出的高位部分丢弃... 阅读全文
posted @ 2012-05-24 21:47 ahl5esoft 阅读(177) 评论(0) 推荐(0) 编辑
摘要: 经过一番努力以后,终于给自己定下了学习c/c++的目标,学习一门新的语言,对于编程思想可能也要有所转换,毕竟c是面向过程语言而c++则是在此基础上添加了面向对象的特征,从语法的角度来讲,跟C#也是有很多的不同的地方。此系列文章便是我在学习c/c++的过程当中遇到的一些问题的记录。 此番计划中第一本书便是《C程序设计语言(第二版)》,从最简单的“Hello, World”开始,前面的几个练习也都是为了能更好的熟悉这门语言而设立的。 可能是编码习惯的原因,对于各种编码练习,总是不习惯将它们全部放在一个函数内,于是想将其重构成额外的练习函数,于是我便在没有了解的情况下,想将练习的内容放入... 阅读全文
posted @ 2012-05-24 04:59 ahl5esoft 阅读(261) 评论(0) 推荐(0) 编辑