1.指针是什么
指针是内存中一个最小单元编号,也就是地址
一个字节(8bit)对应一个地址.
32位的机器可以产生2的32次方个地址,指针的大小是4个字节
64位的机器可以产生2的64次方个地址,指针的大小是8个字节
注:平时我们口语中常说的指针其实指的是指针变量,指针变量是一个用来储存地址的变量
我们可以通过&(取地址符)来取出一个变量的地址,然后将其储存在一个变量里,这个变量就是指针变量
2.指针的类型
指针的定义方式是 type*
如: int* pa=&a;
这样就定义了一个整型指针,也可以定义其他类型的指针,方法同上
定义某类型的指针是为了存放某类型变量的地址
指针的类型也决定了指针的步长,即指针向前走一步或向后走一步的距离有多大
#include<stdio.h>
int main()
{
int a = 0;
int* pia = &a;
char* pca = &a;
printf("%p\n", pia);
printf("%p\n", pca);
printf("%p\n", pia+1);
printf("%p\n", pca+1);
return 0;
}
指针的类型还决定了,指针在被解引用的时候访问内存的权限,例如int 型指针被解引用访问四个字节,char型指针被解引用访问一个字节,以此类推。
3.野指针
野指针就是指向的位置是不可知,完全随机的指针,如其名就像野狗一样危险
它的主要成因有:
1.指针未被初始化
2.指针越界访问,比如访问数组时超出数组范围,这时该指针就成了野指针
3.指针指向的空间被释放
知道了野指针的成因我们就要讨论一下如何规避野指针:
1.创建一个指针变量时,要将其初始化成NULL,当然如果知道这个指针该指向哪就更好了,总之一定要提前初始化,防止指针乱指。
2.要小心指针越界,尤其在访问数组的时候,设置好约束条件。
3.当指针指向的空间被释放的时候,即刻给指针赋NULL。
4.避免指针返回局部变量的地址,因为局部变量作用域太小,出作用域就死了,这个时候如果指针访问该局部变量的地址,就属于非法访问,因为这块内存空间已经被还回去了。
5.在指针使用之前检查它的有效性,如果是野指针就不要用。
4.指针数组和数组指针
指针数组:用来存放指针的数组
数组指针:一个指向数组的指针,有了数组指针就可以利用它访问一个数组
这两个名字很相似,但意义完全不同的概念不要混淆
注:数组名表示数组首地址,但是有两个例外情况,除此之外均可把数组名理解为数组首地址
1.sizeof(数组名)是计算整个数组的长度
2.&数组名是取出整个数组的地址
5.指针的运算
指针+-整数表示指针向前或向后跳几个步长
指针-指针得到的是两指针之间的元素个数,前提是这两个指针必须指向同一块空间
指针++/--表示指针前进/后退一步长
C标准还规定,允许指向数组元素的指针与指向数组最后一个元素后面的那个内存位置的指针比较,但是不允许与指向第一个元素之前的那个内存位置的指针进行比较。
6.多级指针
如二级指针的定义 :int** ppa=&pa;
其中int*表示指针所指向的数据类型是整形指针,
*表示ppa是一个指针变量
同理,以此类推我们还可以有三级指针,四级指针......(平时很少用到)