目录
一、指针是什么
二、指针变量的类型
三、野指针
四、指针运算
1、指针 +- 整数
2、指针 - 指针
3、指针的关系运算
五、指针和数组
六、二级指针
七、指针数组
这两天把初阶指针学了
在计算机的内存管理中,系统把内存以1byte为单位进行切割,每个内存单元所对应的编号就是地址,而指针就是地址。
我们平时说的指针是指指针变量,指针变量是用来存放地址的。
对于32位的地址,地址线有32条,也就是32bit = 4byte,即在32位的系统中指针变量的大小位4byte,以此类推,64位系统的指针变量大小位8byte。
数据的存储有int、long、short等不同类型,相对的,指针也有不同类型。将不同类型的数据的地址存入指针变量时,我们一般使用数据所对应的类型作为指针变量的类型,即int ~ int*,这是因为指针变量的类型决定了指针变量操作(如修改、读取等)的内存的大小。
相应的,在通过指针变量找到对应数据并修改时,根据指针变量的类型不同,所修改的数据大小也不同,修改时只会改变地址后的对应内存大小( int* -- 4byte char* -- 1byte double* -- 8byte ,以此类推,如char类型的指针变量只会修改后面1byte的内容),即不同的指针类型的意义为以不同的方式访问内存。
注意:大小相同的整形和浮点型指针不能混用,如float* 和 int* 的大小都是4byte,但是二者不能混用,因为浮点数和整形存入内存的方式不同。
野指针的定义:指向位置不可知(随机、不正确、没有限制等)的指针。
常见野指针成因:
2、指针越界访问
3、指针指向的空间被释放
(此处b的地址虽然给了p,但是出了test函数后,b已经被销毁,内存还给系统了,所以p虽然有地址,但是算野指针)
(此处虽然销毁了局部变量,但是数据还在,所以还能读取(但是此时的栈帧有可能被改变,即不能保证值有没有被改变)
注意:*vp++ != (*vp)++
指针减去指针得到的绝对值是指针和指针之间元素的个数
不是所有指针都能相减,指向同一块空间的指针(即同一个数组等)才能相减(否则无意义)
指针之间的比较
注意:在C语言的规范中,允许指针与指向数组最后一个元素后面的指针进行比较,但是不支持和数组前面一个元素的指针进行比较。
数组名表示的是首元素地址。
(注意有两种意外:1、sizeof(arr),括号内的数组名表示整个数组;2、&arr,这里的数组名也表示整个数组。)
由于数组名表示的是数组首元素地址,因此可用指针来访问数组内的元素(见上图)。
指针变量作为一个数据,其自身也需要内存进行储存
而二级指针变量是用来存放一级指针变量的地址
在解引用是,*p找到a,*pp只是找到了p,而**pp才能找到a。
注意:在 int** 中,int* 表示pp指向的对象是 int* 类型,而第二个 * 表示pp是一个指针变量。
(parr两侧的()可加可不加)
可以通过指针数组来关联多个数组:
实现类二维数组的效果