摘要:一.实现1)第一种写法:#include<iostream.h>#include<stdlib.h>#include<time.h>#define LENGTH 15void Merge(int a[],int left,int right,int rightend){ int leftend=right-1; int n1=leftend-left+1; int n2=rightend-right+1; int *tempArrayA=(int*)malloc(sizeof(int)*n1); int *tempArrayB=(int*)malloc(si
阅读全文
摘要:昨日去某公司笔试,碰到一个题如下: 对于一个数组,已知其长度为n,和一小于n的正整数p,将该数组的前p个元素和后面的元素交换一下位置,例如a[15]={1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,1,2,3,4,5,6},若p=6,则输出为{7,8,9,10,11,12,13,14,15},要求占用尽可能少的空间。 思路:其实方法很简单,将每一个元素都向前移动一位,移动P次即可,不要陷入怎么分段拷贝的思路中。 1 #include<iostream.h> 2 3 void move(int *s,int m,int n); 4 5 void main()
阅读全文
摘要:参考文献:《C专家编程》 相信很多同学在初学编程时对char *a=”abcd”和char a[]=”abcd”混淆过,甚至某些教材根本不提其区别,只有在实际编程中出现运行时错误才会发现原来这是一个大问题。在读到《C专家编程》这一章时,对作者所讲真是深有同感,虽然很多东西自己现在是知道的,只不过自己体会是多少走了一些弯路的,要是在我最开始学编程时就能看到这本书该多好。 数组和指针都可以在它们的定义中用字符串常量进行初始化,尽管看上去一样,底层的实现机制却不相同。 定义指针时,编译器并不为指针所指向的对象分配空间,它只是分配指针本身的空间,除非在定义的同时赋值给指针一个字符串常量进行初始化。例如
阅读全文
摘要:/******************************************************************************//* * convert a hex string to an integer. The end of the string or a non-hex * character will indicate the end of the hex specification. */unsigned int hextoi(char *hexstring){ register char *h; register unsigned int c, v
阅读全文
摘要:当处于不同的上下文时,static关键字具有不同的意思: 1.当它用于函数定义时,或用于代码块之外的变量声明时,static关键字用于修改标识符的链接属性,从exteral改为internal,但标识符的存储类型和作用域不受影响。用这种方式声明的函数或变量只能在声明它们的源文件中访问。static只对缺省链接属性为external的声明才有改变链接属性的效果。 2.当它用于代码块内部的变量声明时,static关键字用于修改变量的存储类型,从自动变量修改为静态变量,但变量的连接属性和作用于不受影响。用这种方式声明的变量在程序执行之前创建,并在程序的整个执行期间一直存在,而不是每次在代码块开始执.
阅读全文
摘要:前注:参考《C专家编程》 堆栈段有三个主要的用途,其中两个跟函数有关,另一个跟表达式计算有关。 1.堆栈为函数内部声明的局部变量提供存储空间。 2.进行函数调用时,堆栈存储于此有关的一些维护性信息。这些信息被称为堆栈结构(stack frame,有的书中译为栈帧),灵位一个更常用的名字是过程活动记录(precedure activation recored).它包括函数调用地址(即当所调用的函数结束后跳回的地址)、任何不适合装入寄存器的参数以及一些寄存器值的保存。 3.堆栈也可以作为暂时存储区。
阅读全文
摘要:情况一:a.cpp:int test[3]={1,2,3};b.cpp:#include<iostream.h>extern int test[];void main(){ cout<<test[2]<<endl;}运行结果正确,打印test[2],即3到标准输出。情况二:定义为数组,以指针方式引用a.cpp:int test[3]={1,2,3};b.cpp:#include<iostream.h>//extern int test[];extern int *test;void main(){ cout<<test[2]<&
阅读全文
摘要:1.可以用其他类型说明符对宏类型进行扩展,但对typedef所定义的类型名却不能这样做。如下所示: #define peach intunsigned peach i;/*没问题*/typedef int banana;unsigned banana i;/*错误,非法!*/2.在连续几个变量的声明中,用typedef定义的类型能够保证声明中的所有变量均为同一种类型,而用#define定义的类型则无法保证,如下所示:#define int_ptr int *;int_ptr chalk,cheese;经过宏扩展,第二行变为:int * chalk,cheese;这使得chalk和cheese成
阅读全文
摘要:有如下几种const和指针结合的声明:1.const int *ptr;2.int const *ptr;3.int *const ptr;4.const int *const ptr;5.int const *const ptr; 其中,1,2两种声明表示ptr指向的对象是只读的,但是ptr本身是可以改变的(即可以指向其他内容);3声明表示ptr本身是只读的(即不能改变其值,也就是不能改变其指向);4,5两种声明表示ptr本身和ptr所指向的对象都是只读的。 测试程序如下:(只考虑该测试主题,忽略其他规范)View Code #include<iostream.h>int mai
阅读全文
摘要:在研究GoAhead源码时,看到一个函数定义如下:View Code 1 /******************************************************************************/ 2 /* 3 * Find the smallest binary memory size that "size" will fit into. This 4 * makes the ringq and ringqGrow routines much more efficient. The balloc 5 * routine likes p
阅读全文
摘要:这里只是简单的描述一下C语言中如何使用参数数量可变的函数,至于stdarg.h中关键宏如何实现以及编译器如何处理这些更底层的东西,以后再说。我们知道,C语言中函数体包含三个要素:返回值类型、函数体、参数列表。其中参数列表一般情况下都包含个数及类型确定的参数信息,但是千万不要以为函数的参数就必须是个数确定的,其实我们每天都在用着这些例外的情况:printf(),scanf()..。这种函数的原型一般是ReturnType A (Type a,...Type b,...),第二个省略号即表示该函数参数个数为确定。那么如何在自己的代码中实现这种函数呢?举个例子,我们想编写一个函数average().
阅读全文