指针
指针类型定义:
指针类型标识符前加一个星号,表示标识符到表达数据类型为指针类型。同时定义多个指针类型时在每个标识符前都要加星号。
int *p,a; //p是指针类型;a是整型
int *p,*q; //定义两个指针类型变量,基类型同为int
指针类型初始化:
如果不初始化,指针变量中存放随机值,此时指针被称为野指针。经过初始化可以使指针变量有明确的指向。
int *p = NULL; //0号地址//空指针
指针变量赋值:
指针变量中存放的数据为地址,在赋值时要对变量取地址后将地址赋值给指针变量。
int *p,a; //p是指针类型;a是整型
p = &a; //指针类型赋值
应用
指针的一大作用为通过间接访问对变量进行修改,利用这一特性可以弥补函数数值传递时无法修改函数外变量值的不足。因此指针的地址传递在函数中被大量使用。
址传递:
指针作为函数参数,用传递地址的方式间接传入变量。
函数形参:指针类型变量,用来接受实参(变量地址)
函数实参:需要修改和调用哪个变量就传入谁的地址。但传入的是地址,在被调函数中经过*运算间接访问才能修改变量的值。
//被调函数 接收变量和地址
void max(int a,int b,int *max)
{
if(a > b)
*max = a; //通过间接访问直接修改值
else
*max = b;
}
//主函数 将变量的地址传递给被调函数
int main(void)
{
int a=5,b=3;
int *i = &a;
int *j = &b;
int cmp;
max(a,b,&cmp); //传递地址,在被调函数中修改变量值
printf("max = %d\n",cmp);
return 0;
}
一维整型数组
一维整型数组的数组名表示数组的首元素地址。数组定义后首地址为一个常量,但指针是一个变量,可以自加自减运算。数组中的下标运算符“[ ]”实际上和指针相关。
a[i] <==> *(a + i)
int a[5];
a <==> &a[0]
int *p = a; <==> int *p = &a[0];
指针的运算
int *p = &a;
指针加减一个数表示跳过了几个基类型,只能对常量或同类型指针进行做差,但对同类型指针不能用加法、乘法、除法。
int a = 5;
int b = 8;
int *p1 = &a;
int *p2 = &b;
p1 - p2 //正确 表示地址差
p1 + p2 //错误 指针相加无意义
指针在函数中使用
代码示例:
一.通过指针迭代打印数组元素
void printArrayP(int *begin,int *end)
{
while (begin <= end)
{
printf("%d ",*begin++);
}
putchar('\n');
}
二.通过指针迭代进行插入排序
void insertSort(int *begin,int *end)
{
int *p = begin;
int *q = NULL;
for (p = begin+1; p <= end; ++p)
{
int t = *p;
q = p;
while (q > begin && *(q-1) > t)
{
*q = *(q-1);
--q;
}
*q = t;
}
}