指针的应用场景:
- 函数返回多个值,有些值就只能通过指针传回
- 传入的参数实际上是需要保存带回的结果的变量
- 函数返回运算的状态,结果通过指针返回
常用的套路是:让函数返回特殊的不属于有效范围内的值来表示出错:-1,0(文件)
但是当任何数值都是有效的可能结果时,就得分开返回了:函数的return返回状态(是否运行成功),指针参数返回实际的值,这样的好处是能把函数的返回放到if语句里。
注意第13行,if(divice(a,b,&c)
使用的返回值 - 动态申请的内存
最常见错误
定义了指针,还没指定任何变量,就开始使用指针
即,不能对悬浮指针直接赋值,像
int *p;
*p=12; //错误,因为还没有任何指向,程序容易发生崩溃
指针运算
p++:先取出p所含有的东西,再把p++
两个指针相减表示的是:这两个地址之间所能存放的数据个数,即:地址只差/sizeof((当前类型))
指针比较:地址的比较
用NULL表示0地址:
int *p=NULL; //初始化指针用NULL
void*指针:
char *a[]的使用:
注:二维数组中第二个括号里要求填入具体数字,第一个括号里可以不填
const的问题:
1.所指是const:表示不能通过这个指针去修改那个变量(并不能使得那个变量成为const)
const int *p=&i;
*p=26;//error!(*p)是const
i=26;//ok
i++;//ok
p=&j;//ok
//i是可以变化的,p也可以指向其他的地址,但是不能通过p去修改所指地址的值
判断哪个被const了的标志是:const在*的前面还是后面
int i;
const int* p1=&i;//(1)
int const* p2=&i;//(2)
int *const p3=&i;//(3)
//(1)(2)其实是一样的,const在*前面,表示指向的值不能修改
//(3)const在*后面,表示指针不能被修改