回调函数(callback):把函数指针作为参数传入函数,使函数本身可以不知道该指针所致函数的具体功能,从而将函数的定制交给别人。
Rule(“hello”);
(*Rule)(“hello”);
对于函数来说,函数的名字等于它的地址,所以两种形式都可以使用。
为什么用函数指针:
- 封装函数,防止重名,调用方便
- 回调函数,避免工作时,需要反复的做接口。
算法:
- 泡沫算法
for(int i=0;i<len-1;i++)
{
for(int j=0;j<len-i-1;j++)
{
if(a[j]>a[j+1])
{swap(a[j],a[j+1]); //swap为换位函数在这里就不打了,作用就是将两个数的值交换。
}
}
- 选择算法
for(int i=0;i<len;i++)
{
int min=i;
for(int j=0;j<len;j++)
{
if(a[min]>a[j])
min=j;
}
int temp=a[i];
a[i]=a[min];
a[min]=temp;
}
- 插入排序
for(int i=1;i<len;i++)
{
int temp=a[i];
int j=i;
for(;j>0;j--)
{
if(a[j-1]>a[i])
{
a[j]=a[j-1];
}
else
break;
}
a[j]=temp;
}
- 快速排序
void fastSort(int *a,int start,int end)
{
int left=start;
int right=end;
int temp=a[start];
while(left<right)
{
while(left<right&&a[right]>temp)
{
right--;
}
if(left<right)
{
a[left]=a[right];
left++;
}
while(left<right&&a[left]<temp)
{
left++;
}
if(left<right)
{
a[right]=a[left];
right--;
}
a[left]=temp;
fastSort(a,start,left-1);
fastSort(a,right+1,end);
}
}
递归:函数自己调用自己
- 要有终止条件。
- 知道递归的循环体是谁。
- 递归的运算速度算比较慢的
二维数组
a[2][3]=>[2]代表行,[3]代表列;
int a[2][3]={{1,2,3}{4,5,6}}与int a[2][3]={1,2,3,4,5,6}是等价的
a:表示二维数组的首行地址,步长为一行数组,在此为12字节
&a:整个二维数组的首个地址,步长为整个数组,在此为24字节
&a[0]:与a完全相等,表示二维数组的首行地址,步长为一行数组,在此为12字节
&a[0][0]:二维数组首行首元素的地址,步长为该元素的数据类型,在此为4字节
二级指针
int *ptr=&a
int**ptr2=&ptr;
ps:ptr2中存储的是ptr的地址
因为数组有边界,所以需要对指针进行限制
数组指针(int(*p)[3]=a;):指向一个固定长度的数组的指针,本身是一个二级指针
*a:表示数组首行首元素的地址
**a:表示首行首元素的值
*(*(a+1)+1):表示第二行第二个元素的值
ps:(a+1)表示第二行元素的地址 *(a+1)+1表示第二行第二个元素的地址
二维数组要配二级指针
*p=a:强行将二维数组给一维指针,(强行降维)计算机就会将其看成一维数组
指针数组(int* p[4]):数组里的每个元素都是指针,本身是一个数组
ptr[1]与*(ptr+1)是等价的
&s[0],&s[1]之间差一个指针的大小,即为8个字节。
字符串指针数组:特点:数组里的每一个数组指针都是连续的,它所指元素的地址