一、指针
1.指针的强制转换
2.指针的加法运算
(1)p+n:往后挪n * sizeof(基类型)个字节;
(2)常用于整型数组中;
(1)a[i] <=> *(a + i);
` (2)*a++回导致编译报错,*p++可以,因为p是指针变量,但是a是指针常量;*(a+i)可以;
3.指针与数组的相爱相杀
(1)数组的逆序
void reverseArry(int *a,int len)
{
int i;
for(i = 0 ;i < len / 2;++i)
{
int t;
t = *(a+i);
*(a+i) = *(a + len - i - 1);
*(a + len - i -1) = t;
}
}
int main(void)
{
int a[]={1,2,3,4,5,6,7,8,9,0};
int len = sizeof(a)/ sizeof(a[0]);
reverseArry(a,len);
printArry(a,len);
return 0;
}
void swap(int *a,int *b)
{
int t;
t = *a;
*a = *b;
*b = t;
}
void reverseArryP2(int *a,int len)
{
int i;
for(i = 0 ;i < len / 2;++i)
{
swap((a+i),(a+len - i -1));
}
}
int main(void)
{
int a[]={1,2,3,4,5,6,7,8,9,0};
int len = sizeof(a)/ sizeof(a[0]);
reverseArryP2(a,len);
printArry(a,len);
return 0;
}
(2)找出最大值
int maxOfArry(int *a,int len)
{
int i,max = *a;
for(i = 0 ;i < len;++i)
{
if(max < *(a+i))
{
max = *(a+i);
}
}
return max;
}
int main(void)
{
int a[]={1,2,3,4,5,6,7,8,9,0};
int len = sizeof(a)/ sizeof(a[0]);
printf("%d\n",maxOfArry(a,len));
return 0;
}
(3)冒泡排序
//冒泡
void bubbleSort(int *begin,int *end)
{
int *p;
for(end;end > begin;--end)
{
for(p = begin;p < end;++p)
{
if(*p > *(p + 1))
{
swap(p,p + 1);
}
}
}
}
(4)插入排序
//插入法
void inserSort(int *begin,int *end)
{
int *q = begin;
int t;
for(begin;begin < end;++begin)
{
int *p = begin + 1;
t = *p;
while(p > q && *(p - 1) > t)
{
*p = *(p -1);
--p;
}
*p = t;
}
}
(5)选择排序
//选择
void choicesort(int *begin,int *end)
{
int *p;
for(begin;begin < end;++begin)
{
for(p = begin + 1;p <= end;++p)
{
if(*begin > *p)
{
swap(begin,p);
}
}
}
}
3.为了杜绝野指针的出现,int *p = NULL/p =NULL,p称为空指针,空指针无法进行指针运算,他代表指针的状态,表示该指针指向的空间不可被访问;NULL:#define NULL(0);
4,指针型函数:
5.指针的比大小:比的是地址的前后;但是注意要保持两个指针的基类型一致;
int a[] = {1,2,3,4,5,6,7,8,9,0};
int *p = a;
int *q = a+1;
printf("%d\n",q>p);
6.快速排序算法:迭代器+递归调用思想
void Qsort(int *begin, int *end)
{
if(begin >= end)
{
return;
}
int t = *begin;
int *q = end;
int *p = begin;
while(p < q)
{
while(p < q && *q >= t)
{
--q;
}
while(p < q && *p <= t)
{
++p;
}
swap(p, q);
}
swap(begin, p);
Qsort(begin, p - 1);
Qsort(p + 1, end);
}
7.查找
int *binaryFind(int *begin,int *end,int n)
{
while(begin <= end)
{
int *mid;
mid = (end - begin) / 2 + begin;
if(*mid > n)
{
end = mid - 1;
}
else if(*mid < n)
{
begin = mid + 1;
}
else
{
return mid;
}
}
return NULL;
}
//使用一对迭代器,并采用函数递归调用的方式实现二分查找
int *binaryFind(int *begin,int *end,int n)
{
if (begin > end)
{
return 0;
}
int *mid;
mid = (end - begin) / 2 + begin;
if(*mid > n)
{
end = mid - 1;
}
else if(*mid < n)
{
begin = mid + 1;
}
else
{
return mid;
}
binaryFind(begin,end,n);
}
8.指针的运算注意事项
(1)在加法两端必须是一个是指针一个是常数,不可以两端都是指针;
(2)减号两端可以都是指针,必须要保证两个指针的基类型一致,相减之后的表达式时int型,差值是两个指针之间相差了几个基类型,差值的正负可以判断两个指针的前后位置;