学会指针只需要记住以下几点
1、指针其实就是一种数据类型,不过这种数据类型的使用方式比较特殊。(int*)、(char*)都是数据类型。
2、指针这种数据类型里存放的都是地址,不是数据。要调用指针里的数据就在变量名前加一个*。
如 int* a; (int*)就是数据类型 a就是变量 ,a只能存放地址(a=地址),要调用a地址里的数据 ,那就使用*a。比如 int* a; int b=1; a=&b; 此时 *a 就是1 等价于b。
3、在使用指针时有些地方需要加取地址符有些地方不需要加,大多数人就被绕晕了,我们将指针的操作分为2大类,一类是数组类型的,一类是非数组类型的。按这种分类,学会数组类、非数组类的指针使用,就学会了指针。
(1)数组类指针使用方法
a.数组类的指针在传参数时, 取数组首地址可以使用取地址符也可不使用取地址符。取用数组的非首地址时必须使用取地址符并带下标 比如:&buf[1] 详见以下代码注释
b.通过指针传递的数组平时怎么使用数组,在传递后继续怎么使用数组就行了。
例如:
//此处 (char*) 就是数据类型,dat就是变量,变量里存放的是地址,占用4字节
//想要调用地址里存放的数据就使用*dat, *dat就是首地址存放的数据 0x01
//当想调用数组的下一个数据时*dat++ 因为++优先级高于* 所以*dat++ 是先执行dat++ 再执行*
//但是对于指针传进来的数组,可以直接使用数组下标的方式调用更加方便。
void fun(char* dat,int len)
{
int i=0;
for(i=0;i<len;i++)
{
printf("%02x ",dat[i]);//此处若更改dat[i]的值 就相当于更改main中buf[i]的值
}
}
void main(void)
{
char buf[3]={0x01,0x02,0x03};
fun(buf,3);//注意使用数组指针时 长度不要超出数组长度 否则代码跑飞
fun(&buf[0],3);
//此处的 buf 与 &buf[0] 是同一个东西 都是数组的首地址
//若想传递非数组首地址 只能通过 &buf[i]的形式
}
(2)非数组类指针使用方法
非数组类的在传参时一定要使用取地址符,使用数据时一定要在变量名前加*
void fun(char* p1,int* p2)
{
*p1=3;//该函数内部 *p1 等价于a p1等价于&a
*p2=4;//该函数内部 *p2 等价于b p2等价于&b
}
void main(void)
{
char a=1;
int b=2;
fun(&a,&b);//指针传参必须使用取地址符
printf("a=%d,b=%d",a,b);//输出结果为a=3,b=4
}