指针是内存中的一个最小单元的编号,也就是地址。平时说的指针通常指的是指针变量,用来存放内存地址的变量。地址唯一标识一块内存空间。
指针其实就是地址。可以通过取地址取出变量的内存地址
指针指向时,指针所存储的只是指向数据的首地址。
- #include
- int main()
- {
- int a = 10;//在内存中开辟一块空间
- int *p = &a;//这里我们对变量a,取出它的地址,可以使用&操作符。
- //a变量占用4个字节的空间,这里是将a的4个字节的第一个字节的地址存放在p变量中,p就是一个之指针变量。
- return 0;
- }
总结:指针变量,用来存放地址的变量。(存放在指针中的值都被当成地址处理)
那么一个单元是多大呢?1个字节
如何编址呢?
指针类型有int*、char*、short*......
指针类型的意义是什么呢?
可以用来指向不同数据
指针类型决定了对指针解引用的时候有多大权限(能操作几个字节)比如: char* 的指针解引用就只能访问一个字节,而 int* 的指针的解引用就能访问四个字节。比如: char* 的指针解引用就只能访问一个字节,而 int* 的指针的解引用就能访问四个字节。
野指针指的是一些指向位置不可知的指针(随机的、不正确的、没有明确限制的)
野指针的成因:
1.指针未初始化
2.指针越界访问
3.指针指向的空间释放
做到这几点,规避野指针
1.指针初始化
2.小心指针越界
3.指针指向空间释放即使其置为空
4.避免返回局部变量的地址
5.指针使用之前检查其有效性
指针+-整数时会根据指针的类型来决定向前或向后走一步的距离有多大
同类型的指针减指针,得到的是指针间相差的元素个数
不同类型的指针减指针会引发访问冲突,出现异常,所以只能用相同类型的指针-指针
指针间的比较大小实际上比较的是地址。
标准规定:
允许指向数组元素的指针与指向数组最后一个元素后面的那个内存位置的指针比较,但是不允许与指向第一个元素之前的那个内存位置的指针进行比较。
int* arr1 [ 10 ]; // 整形指针的数组char * arr2 [ 4 ]; // 一级字符指针的数组char ** arr3 [ 5 ]; // 二级字符指针的数组
数组指针的本质是指针,是一个指向数组的指针
下面代码哪个是数组指针?int * p1 [ 10 ];int ( * p2 )[ 10 ];//p1, p2 分别是什么?int ( * p )[ 10 ];// 解释: p 先和 * 结合,说明 p 是一个指针变量,然后指着指向的是一个大小为 10 个整型的数组。所以 p 是一个指针,指向一个数组,叫数组指针。// 这里要注意: [] 的优先级要高于 * 号的,所以必须加上()来保证 p 先和 * 结合。p1是指针数组,p2是数组指针