目录
意义:
代码更加简单高效;
指针可以直接访问内存;
指针可以操作硬件;
地址:
用来区分内存当中不同
指针:
地址就是指针,指针就是地址,指针多了一个指向的概念
指针变量:
是一个变量,变量里面存了一个指针(地址),称为指针变量,指针变量在linux18占8个字节空间
使用指针变量等价于使用其内部存放的指针,所以我们有时也把指针变量简称为指针。
运算符:
&:只能操作左值(就是变量),取地址
int num;
&num:
获得变量在内存空间中的首地址
打印地址用%p
类型就会变为int * (&有类型升级效果) &&就是int **,其他类型相似
*:只能操作指针类型
* &num
值:获得&num指针对应空间的值,就会拿四个字节的值,因为num是int
类型会变成一个int(*有类型降级效果)
*&num = 100;*作为左值,就是将右值放入左变指针指向的空间
*#作为右值,就是直接取指针指向空间的值(*和&抵消)
指针变量的定义:
int *p,*q;(指针变量没有进行初始化,是随机值,或指向已经被释放空间的指针叫做野指针)
指针一定要初始化;
初始赋值空指针,指向内存地址为0x0的指针: int *p = NULL; 本质也是0,“\0”,(0X0)
所有的指针变量都站8个字节,包括数组指针等不管类型
直接访问:通过变量的变量名访问内存空间
间接访问:通过变量在内存中的地址访问变量空间(有的变量没名字,或者是变量名访问不了)
常见的指针操作
int *p = NULL;
int *q = NULL;
int a = 100;
int b = 200;
p = &a;
q = &b;
1,p= &b; 把b的地址给p,现在p指向b
2,*p = b; 把b的值给了*p,也就是改变了a的值,指向空间不变
3,p = q; 把q的值给p,p也就指向了b
4, *p = *q; 把b的值给a,指向空间不变
初始化直接指向a
int *p = &a;是可以的 (p的类型是int *,&降级a类型也是int *)
指针的算数运算
int *p =NULL;
int *q =NULL;
int a =100;
p = &a;
+ :指针加1,不是加1,是加一个类型的所占字节,int就是加4个字节,char就是一个字节,double就是8个字节;
p+1(p++):就是向内存高地址偏移指向数据类型大小字节空间
-:
p-1(p--):就是向内存低地址偏移指向数据类型大小字节空间
p-q:两个指针相减,得到两个指针相差几个数据类型
p++:是a的地址加加
*p++:*p 先取值。用p对应的值
p++ 再让p++
注意++的运算过程是先用再加
指针作为函数参数
赋值传递:形参不会改变实参
函数体内想要使用函数体外部变量值的时候使用赋值传递
地址传递:实参的地址传递给形参,形参就是实参的指针,可以通过形参取*改变实参的值
函数体内向修改函数外部变量值的时候使用地址传递
做题总结
逗号表达式是从左向右依次执行,并将逗号最后一个参数作为结果
随机数rand(); 按照时间的随机数 srand(time(NULL));