static
1.当它作用于函数定义或者代码块之外的变量声明时,static关键字用于修改标识符的链接属性。变量或者函数只能在当前源文件中进行访问。
2.用于代码块内部进行变量声明时,static关键字用于修改变量的存储类型。从自动变量变为静态变量。
volatile
作用:编译时不断优化,执行时不缓存,每次需要从内存中读出(保证了内存的可见性)。
const
用来定义常量,如果一个变量被const修饰,那么它的值就不能被改变。
递归
程序调用自身的编程技巧称为递归。
递归的主要思考方式在于:把大事化小
求第n个斐波那契数(不考虑溢出)
1 1 2 3 5 8 13 21 34 55 85…
int fib(int n)
{
if(n<=2)
return 1;
else
return fib(n-1)+fib(n-2);
}
求n的阶乘(不考虑溢出)
int factorial(int n)
{
if(n<=1)
return 1;
else
return n*factorial(n-1)
}
问题:
- 在使用fib这个函数的时候如果我们要计算第50个斐波那契数的时候非常耗费时间。
- 使用factorial函数求10000阶乘(不考虑结果正确性),程序会崩溃。
//求第n个斐波那契数(非递归)
int fib(int n)
{
int result;
int prev_result;
int next_result;
redult = prev_result;
while(n>2)
{
n-=1;
next_result=prev_result;
prev_result=result;
result=prev_result+next_result;
}
return result:
}
模拟实现strcpy
char *my_strcpy(char *dest,const char *src)
{
assert(dest!=null);
assert(src!=null);
char *ret=dest;
while(*dest++=*src++)
//先进行了复制再进行了++,当复制到终结符'\0',不符合while的判断条件,退出循环
//而此时已经将所有的内容复制到字符中了
{
;
}
return ret;
}
* 逆置/反转单链表*
分析:每次取下一个节点放到头结点前边,然后将头指针前移。
void LinkListReverse(LinkNode** phead){
if(phead==NULL){
//非法输入
return;
}
if(*phead==NULL){
//空链表
return;
}
if((*phead)->next == NULL){
//只有一个结点
return;
}
LinkNode* cur=*phead;
while(cur->next!=NULL){
LinkNode* to_delete = cur->next;
cur->next=to_delete->next;
to_delete->next = *phead;
*phead = to_delete;
}
return;
}