1.指针的定义和初始化
(1)&a: 取地址符(单目运算符)
a&b: 按位与(双目运算符)
*的三种用法:
(1) 乘法:3*4=12
(2) int *p=&a; //定义指针变量
(3) *p=100; //解引用
(2)int *p=&a; //定义整型指针变量(p)保存整型地址值
*p=100; //间接访问符(解引用)通过p间接访问变量a的值并把a的值赋为100
2.解引用
解引用是指针变量与普通变量的唯一不同
(1)通过一个简单的例子,了解指针:
int a,b,c,d;
int *p1=&a; //定义一个指针变量p1指向a
int *p2=&b; //定义一个指针变量p2指向a
*p1=100; //解引用,把a的值赋为100
*p2=200; //解引用,把b的值赋为200
p1=&c; //p1指向c
p2=&d; //p2指向d
*p1=300; //解引用,把c的值赋为300
*p2=400; //解引用,把d的值赋为400
p1=&c; //p1指向c
p2=&a; //p2指向a
p1=&d; //p1指向d
*p2=1000; //解引用,把a的值赋为1000
*p1=2000; //解引用,把d的值赋为1000
(2)二级指针的解引用:
int **pp=&p;
*pp=&a; //p=&a,*pp就是p(解引用)
*pp=1000; //a=1000
3.总结:(1)指针==地址
(2)获取任何变量的地址都是:&变量名
(3)*指针变量名,则间接访问到(跳到、解引用)指针所指向的变量
4.指针的应用
调用函数,实现交换两个数的值。
//子函数的改变要想修改父函数的值,
//必须要1、传指针,2、解引用
void Swap_err1(int a,int b)
{
int tmp;
tmp = a;
a = b;
b = tmp;
//printf("%d,%d\n",a,b);
}
void Swap_err2(int *p1,int *p2)//有传指针,但是没有解引用
{
int *tmp = p1;
p1 = p2;
p2 = tmp;
}
void Swap_err3(int *p1,int *p2)
{
int *tmp;//野指针,悬挂指针
*tmp = *p1;
*p1 = *p2;
*p2 = *tmp;
}
void Swap(int *p1,int *p2)
{
int tmp= *p1;
*p1 = *p2;
*p2 = tmp;
}
int main()//调用函数,父函数
{
int a =10;
int b = 20;
Swap(&a,&b);//被调用函数,子函数
printf("%d,%d\n",a,b);
return 0;
}