概念:
指针就是指地址, 指针是一种数据类型,专门用来存储地址这种数据的数据类型。
指针变量的定义:
基类型 * 变量名;
eg:
int a = 10 ;
int *p = &a;
*p运算:
1、首先拿出p中地址,到内存中定位
2、定位到之后,从定位处开始,偏移出sizeof( 基类型 ) 的一块空间
3、将这块空间当作一个基类型的(变量)来看
(可以使用强转将不同类型的变量放在指针中)
&*p //&(*p) 相当于取a的地址
打印地址使用 ------> %p
*&p // ====》 p本身
//p存放的是int *
// &p ==> 对应地址的类型是 int** //int*表示基类型 后面的*表示说是一个地址类型的数据
//*(&p) 《==》 基类型变量来看(int*类型的一个变量)
*&a // 也就是a
&*a //会报错 a不是一个指针类型的变量 所以不能编译!运算类型不对
指针初始化:
int *p; //野指针 --- 指向不明确的指针
int *p = NULL ; //NULL是 地址 0。
--------------------------------
连续定义多个指针变量的时候:
eg: int *p1,*q1,*r1; //不能使用int *p,q,r;
为什么需要指针?
有些时候,不使用指针,没有办法达到想要的效果!
一次函数调用只能返回一个结果,可以通过指针的调用返回多个结果。
eg:
int add(int a, int b , int *rAdd)
{
int ret ;
ret = a + b;
*rAdd = ret; //通过指针的间接访问实现 被调函数 修改 主调函数中的 变量
return re
}
int main(void)
{
int ret1 = 0;
printf("%d",add(1,2,&ret1)); //此时ret1中的数据就变成了ret的值啦,也就是3
}
注意:
使用方法:(被调修改主调)
1、 要修改谁,就把谁的地址传过去
2、 !!!!一定要对其做 * 运算