指针初级
一、指针是什么?
在计算机科学中,指针(Pointer)是编程语言中的一个对象,利用地址,它的值直接指向(points to)电脑存储器中另一个地方的值。由于通过地址可以直接找到所需的变量单元,可以说,地址指向该变量单元。因此,将地址形象化的称为“指针”。意思是通过它能找到以它为地址的内存单元。
我们把内存划分为一个一个的内存单元,取一个字节为一个基础的内存单元。同时为了能更好的管理这些内存单元,我们设置了编号,也称为内存单元的“地址”,如:0x00000001。因为地址指向这些内存单元,所以也把这些地址称为“指针”。
总结
1.指针是用来存放地址的,地址是唯一标识一块地址空间的。
2.指针的大小在32位平台是4个字节,在64位平台是8个字节。
二、指针和指针类型
我们发现不论指针是什么类型的,它都是占4个字节。但是我们不能建立一个通用指针,用一种指针类型表示所有的指针类型。那么指针的类型有什么用呢?
指针类型的意义:
1、指针类型决定了:指针解引用的权限有多大(能操作几个字节)。
如:int类型指针解引用能访问4个字节,而char类型指针解引用只能访问1个字节,double类型指针解引用能访问8个字节。当你要从某一个地址向后访问一个整型的时候,我们最好拿一个整型指针int*
来解应用,因为整型指针刚好能访问4个字节。
将数组arr的地址放到p和pc中,p是int*
指针,pc是char*
指针。arr是整型数组,放到p中是没有问题的,pc虽然是字符型指针,但是如果强行把arr的地址放进去也能存的下。所以不管写成什么指针,它里面都能存放地址。
我们看到因为p和pc放的都是数组名,所以两者的地址是一样的。整型指针+1相当于跳过一个整型,p+1和p的地址会相差4个字节,所以p的地址会+4;而字符型指针+1相当于跳过一个字符,pc+1和pc相差1个字节,所以pc的地址会+1。
2、指针类型决定了:指针走一步能走多远,步长会是多长。
如:double型的指针+1,地址会+8。p+1到底加几取决于p的类型,跟p指向的对象没有关系,跟p被赋予的值也没有关系。
三、野指针
概念:野指针就是指针指向的位置是不可知的(随机的、不确定的、没有明确限制的)。
1、野指针的成因:
(1)指针未初始化
int main()
{
//这里的p就是一个野指针
int* p;//p是一个局部的指针变量,局部变量不初始化的话,默认随机值
*p = 20;//非法访问内存了
return 0;
}
p是一个局部的指针变量,放的是一个随机的地址。*p是对p进行解引用操作,访问p指向的地址,但是这个地址不一定是属于我们当前的程序。所以造成了非法访问内存。
这部分代码是无法正常运行的。
(2)指针越界访问
int main()
{
//2、越界访问
int arr[10] = {
0 };
int* p = arr;
int i = 0;
for (i = 0; i <= 10; i++)
{
*p = i;
p++;
}
return 0