指针变量初始化
使用指针时应该对指针变量进行初始化
可以初始化为 int*p = NULL
或者int*p = &a
指针是C语言的精髓,它可以在函数中实现被调修改主调这也是指针80%的功能
要实现被调修改主调
指针作为函数参数
形参 指针类型变量 用来接受实参(实参是要操作的内存地址空间)
实参 要修改谁,就要把谁的地址传过去
(个人理解为形参像是影分身,实参是本体,指针则可以直接对本体产生作用)
被调函数中一定要有*p的计算 (间接访问操作)
指针 + 一维数组
类型
int *p = a;
int *p = &a【0】;
数组名————数组首元素地址
这个地址值的类型
a<=>&a【0】
a【0】 的数据类型 int型
&a【0】地址的类型 int *
int *p = a; 表示p指向了数组a
*p <=> a[0] <=>a;
p<=>&a
指针之间的运算
& *
p+1 跳过了 n个基类型
p-1 跳回了 n个基类型
p++ p--
比较> >= < <= == !=
其中
可以 p-q 表示差了多少元素(基类型)必须是同一类型的指针
可以算(p-q)+p
不可以 p+q
下面三个等价式子体现了数组和指针密切联系
*(p+i)<=>a[i]<=>*(a+i)
a[i] <=> *(a+i)
i[a] <=> *(i+a)
(*p是实际的值 p类似于数组的下标)
基于指针的排序和查找
其中swap为交换
void Swap(int *a,int *b)
{
int swap = *a;
*a = *b;
*b = swap;
}
选择排序
void selection(int *begin, int *end)
{
int *p =begin;
int *q = NULL;
for(p = begin; p < end; ++p)
{
for(q = p+1; q <= end ; ++q)
{
if(*p >*q)
Swap(p,q);
}
}
}
冒泡排序
void bubble(int *begin, int *end)
{
int *p = begin;
int *q = NULL;
for(p = end; p > begin ; p--)
{
for(q = begin; q < p; q++)
{
if(*q > *(q + 1))
{
Swap(q + 1, q);
}
}
}
}
插入排序
void insertion(int *begin, int *end)
{
int *p = begin;
int *q = NULL;
for(p = begin ; p <= end; ++p)
{
int t = *p;
q = p;
while (q>begin && t < *(q-1))
{
*q = *(q-1);
--q;
}
*q = t;
}
}
二分查找
int *binaryFind(int * begin ,int *end,int n
{
int *mid = NULL;
int *ret = NULL;
while (begin<=end)
{
mid=(end - begin)/2+begin;
if(*mid > n)
{
end = mid - 1;
}
else if(*mid < n)
{
begin = mid +1;
}
else
{
ret =mid;
break;
}
}
return ret;
}