目录
定义:
指针是地址,指针变量存放变量。通俗上:指针是存放地址的变量。
把指针当成两个变量(方块)之间的线,更容易理解
指针大小:
一个内存单元默认是一个字节。每个内存单元有个编号叫做地址,取地址取的是第一个字节(内存单元)的地址,较小的地址。
32位机器地址4个字节
64位机器地址8个字节。
不同指针类型意义:
1.都可以存放指针
2.不同指针访问字节数不一样
char*型只访问一个字节
int*型访问4个字节。
double*型访问8个字节
访问的字节的不同,通过指针改变的字节数不同
指针变量可以存放不匹配的数据类型变量地址
3.指针类型决定加一跳几个字节。即指针步长
char*指针加1跳过一个字节
数组地址:存放第一个元素地址。
野指针:
指针指向是不明确的,不确定的
1.局部变量不初始化,默认是随机值,指针变量不初始化,指向的变量就是随机值,变成野指针。
2.越界访问:超出数组范围也变成野指针。
3.指针指向的变量被释放。eg:变量是在自定义函数的变量内,函数结束后那个变量已经被销毁。
指针变成野指针。
空指针:
1.p=NULL。初始化指针,使指针合法存在,指针指向空并没有指向原来变量,依然不能
NULL是 (void*)0
2.检测指针可用性:是否为NULL。if(p!=NULL)
指针运算:
1.指针加减整数:指向下一个地址
eg:*p++=0;后置加加
先*p=0;p=p+1;
--*p=0;
先--p;再使得*p=0;
(函数操作符知识)
2.指针加减指针:
前提:两块指针指向同一块空间,比如数组内。
在数组内:指针减指针的绝对值结果为元素个数。
数组地址下标越低,地址越低
特别的:
在c语言中不允许和指向第一个元素前的内存的指针比较,但允许和指向最后一个的元素后内存的比较。
第一个vp不行,第二个vp可以
二级指针,变量存放指针地址;
定义:类型int** 变量。第一个int*表示指向类型,*表示这是个指针。
解引用:**变量两次解引用。
三次四次以此类推。
数组指针:
数组指针(数组的地址)和首元素的地址相同。
表示数组地址的两种情况:
1.&数组名取的是整个元素地址,数值和首元素地址一样。
可以通过加一来证明。
2.sizeof(数组名)计算整个数组空间。
指针数组:
int arr[3]={&a,&b,&c};
解引用:*(arr[i])
可以猜想arrr是二级指针,两次解引用可以得到a
使用一维数组模拟二维数组:放在数组内的元素是数组首元素指针:
解引用:*(*(p+m)+n)或p[m][n]
二维数组解引用实际上可能也就是这样