立即学习:https://edu.csdn.net/course/play/8088/177054?utm_source=blogtoedu
1. 指向指针的指针
int **p;
*指针运算符,是从右到左结合的,所以相当于*(*p);括号里的*p是指针变量的定义形式。又在前面加了一个*,表示指针变量p是指向 一个 指针变量的,而*p 是p所指向的另一个指针变量;
int abc = 5;
int *pabc = &abc;
int **ppabc = &pabc;
printf("abc = %d\n",abc);
printf("abc = %d\n",*pabc);
printf("abc = %d\n",**ppabc); //*右结合性,三个打印出来的值都为5
2. 指针数组做main函数参数
3. 小结
(1)数据类型表
(2)指针运算小结
(2.1)指针变量加减
p++,p--:不是简单的加减1,而是将指针变量的地址和它所指向的变量所占用的内存字节数相加减。
(2.2)指针变量赋值;
int *p = 1000; //不可以不能直接赋数字,不要认为可以将地址1000赋给p。
只能将变量的已分配地址赋给指针变量;
int a;
int *p = &a;
(2.3)指针变量可以有空值,表示不指向任何变量;
p = NULL; //NULL其实是整数0,就是使p指向地址为0的单元,同时系统也会保证地址为0的这个单元不存放有效数据;有了这种赋值之后,在写程序时,就可以进行指针与NULL的比较;
if(p == NULL)
(3)void *型指针
指针变量定义的时候都会定义它指向某种数据类型;比如指向int的,我们定义int *p;
但void *是属于万能型指针变量,也就是能够指向任意数据类型;
int a = 3;
int *p = &a;
float bf = 5.6f;
float *pf = &bf;
//p = pf; //报错,不可以
//p = (int *)pf; //强制类型转换可,但如果p和pf所指向的数据类型int和float所占用的内存字节数不同,那么操作p就非常危险。
void *pwn = NULL;
pwn = p; //都不报错
pwn = pf; //都不报错
//将来你想使用pf的时候,你可以通过pwn转换回去
pf = (float *)pwn;//已知晓pf的类型