什么是指针?
内存,以一个字节进行分配。
每个字节的内存都有标号,这个标号就叫做地址,也叫做指针,
地址需要存储,32位系统的编译器分配四个字节的内存,那么,64位的编译器也就分配8个字节。
寻址
就像给房间分配房号,根据每个房间的房号找到房间。也就是根据地址找到对应的内存。这也就叫做寻址。
指针就是一种数据类型,
例如:int* p
你可以这样理解,定义了一个变量p,p的数据类型是int*型的。
(1)指针指向谁,就把谁的地址赋值给指针。
int a=12;
p=&a; // 也就是把a的地址赋值给了p
(2)*p 操作指针指向的内存空间
*p =90 //也就是操作了p指向的内存空间,也就是操作了a 将a的值改为90
可能看着代码大家觉得很难理解,但是,画图之后就会很好理解。
结合这个图 ,你就可以理解了 *p 间接操作了a的值
- ‘’*‘’ 有两层含义
- (1)定义变量时,‘*’它表示类型, 它是指针类型 int *
- (2)使用变量时,‘*’表示操作指针所指的内存空间。 *
野指针
(1)所谓野指针就是 保存没有意义地址的指针变量。
(2)操作野指针变量本身不会出现任何问题。
(3)操作野指针指向的内存才会出现 段错误 。、
p里面存储了一个未知的内存,当他操作指针所指向的内存空间时,程序就会死掉,因为它操作的是一个没有授权的内存 ,也就是,只有定义后的变量,此变量的地址才是合法地址。
那么 ,有人会问 ,段错误是啥意思呢?
段错误应该就是访问了不可访问的内存,这个内存区要么是不存在的,
要么是受到系统保护的,还有可能是缺少文件或者文件损坏。
段错误一般都是操作指针引起的
要么是访问系统数据区,要么是内存越界引起的。
*p 等价于 p[0] 同时等价于 *(p+0)
万能指针
void * p=NULL
不可以定义void类型的普通变量,因为不能确定其类型
void a;//error
可以定义void * 变量,void* 指针也叫作万能指针。
void * 可以指向任何类型的变量,使用指针所指向的内存时,最好转换为它本身的指针类型。
int * 指向 int类型,操作内存时,操作4字节 以此类推 char * 也就是一个字节。