一.指针是什么
*说明pa是指针变量,int说明pa指向的a的类型是Int
生成的地址作为一个内存单元的编号。一共有2^23次方个地址,设一个地址为一个字节,那么就有2^23次方个字节(4GB)。
二.指针与指针类型
int num = 0; int* num = #
2.1 指针+-整数
当我们打印两者的地址时,发现没有区别。
现在给它们都加上1,发现就出现不同了。
在数组中,我们同样可以通过不同的指针类型来进行访问的位置。
2.2 指针的解引用
原本a放的是44 33 22 11,但是通过解引用后全部变为0.
当我们尝试把指向a的变量类型改成char时,a的数据存放发生了变化——只改了4个字节中的一个字节。
三.野指针
3.1 野指针成因
1.指针未初始化。
2.指针越界,当访问第11个字节的时候,这是不属于数组的,自然也不能修改。
3.指针指向的空间被释放
虽然最后是取到了a的地址,但是函数一结束栈空间就销毁了,那么这跟未初始化一个道理。
3.2 如何规避野指针
程序会报错:
所以要避免在NULL时对其修改。
四.指针运算
4.1指针+-整数
不管怎么变,其本质都是一个地址加上偏移量。
4.2指针-指针
依次循环,把values数组中的5个元素都变成0.
指针-指针还可以应用于计算数组元素个数:
4.3指针的关系运算
#define N_VALUES 5 float values[N_VALUES]; float * vp; for(vp=&values[N_VALUES];vp>&values[0];) { *--vp=0; }
就是说可以从左往右比,但不建议从右往左比。
五.指针与数组
&arr+1会跳过40个字节,也就是整个数组。
注意,数组名不能++因为它是一个地址,是一个常量。而p可以++,因为它是一个指针变量。
六.二级指针
p与pp都是指针变量,而int * *是类型。
*表示p是指针,而int表示p所指向的类型。
同理*表示pp是指针变量,而int *是说明pp指向的变量的类型是int*。
pp前面加个*,可以找到并修改p,如果再加一个*,那么就是可以找到并修改a。
七.指针数组