指针也就是地址
指针定义:
数据类型 * 指针名;
*号不同应用场景
1.定义指针的时候,类型说明符(后开紧跟的变量是一个指针变量)
2.解引用(通过*地址可以访问到真实物理内存)
3.四则运算乘号
注: 前两种情况只有在定义的时候表示类型说明,其余情况一律为解引用
&号不同应用场景
1.取地址符号
2.位操作符号
int a = 10;
int b = 20; //初始化
int *p = &a; 、//一级指针p 保存变量a的地址
*p = 100; //*p=a=100
p = &b; //保存b的地址
*p = 200; //*p=b=100
整型地址变量P保存整型变量a的地址 ,类型要统一
int **pp = &p; //二级指针pp,保存一级指针地址
*pp = &a; // *pp = p = &a
**pp = 1000; // **pp = *p = a = 1000
*pp = &b; // *pp = p =&b
**pp = 2000; //**pp = *p = b = 2000
二级指针变量pp保存 一级指针p地址
指针与普通变量唯一区别多了一步解引用操作
指针大小只跟系统大小有关即:32位系统为4字节,64位系统为8字节
练习
char a;
int b;
double c;
char* p1 = &a; //定义一个指针p1指向a
int* p2 = &b; //定义一个指针p2指向b
double* p3 = &c; //定义一个指针p3指向c
*p1 = 'w'; //通过p1 修改a的值为'w'
*p2 = 100; //通过p2 修改b的值为100
*p3 = 3.14; //通过p3 修改c的值为3.14
printf("%c %d %f \n", *p1, *p2, *p3); //打印 a b c三者的值
注:指针类型一定要和变量类型统一
指针应用
子函数(被调用函数)
父函数(调用函数)
子函数影响父函数(值传递不可取)
如:交换a 和 b 的值
void Swap1(int a,int b)//error 经典的值传递
{
int tmp = a; //原因swap1里面的a,b和main函数里面a,b的地址不同,
a = b; //因此修改swap1里面a,b无法影响main里面的a,b
b = tmp;
}
void Swap(int *pa, int *pb)//true
{
int tmp;
tmp = *pa;
*pa = *pb;
*pb = tmp;
}
int main()
{
int a = 10;
int b = 20;
Swap(&a, &b);
printf("%d %d\n", a, b);
}