1.什么是指针?
内存中最小单元的编号,本质是地址,但是口语上的指针通常指指针变量。
不同类型机器能够编址访问的地址空间也不同,32位机器能够编址2^32个字节空间,而64位机器能够编址2^64个字节空间。
补充:机器产生需要访问的虚拟地址后通过地址线传输访问内存。
2.指针类型
指针类型决定了:
1)指针再被解引用时的访问权限——访问多大的空间。
2)指针移动一步的距离。
3.野指针
野指针:指针指向的位置是不可知的(随机的、不确定的)
产生原因:
1)指针未初始化;
2)指针越界访问;
3)指针指向空间被释放,但是指针没有被置为空指针。
规避:
1)NULL初始化;
2)小心指针越界;
3)指针指向空间被释放时及时置为NULL;
4)指针在使用时检查有效性——是否为NULL。
补充:0地址到一定范围内的内存只允许操作系统使用,用户使用不了。
4.指针运算
1)指针加减整数——指针的前后移动
2)指针-指针——两个指针之间的地址数(字节数)
3)指针的关系运算——指针本质也是值
注意:C语言标准规定了,允许指向数组的指针与数组后面那个内存位置的指针作比较,但不允许与数组前一个内存位置的指针作比较。
5.指针和数组
数组名就是数组首元素的地址,但是数组和指针不是一回事。
6.二级指针
指向指针的指针,保存的是指针的地址,int*——指向的是int*类型,后一个*说明该变量是指针。
int a = 1;
int* p = &a;
int** pp = &p;
7.指针数组
保存指针的数组。
int arr1[5] = {0};
int p1 = arr1;
int arr2[5] = {0};
int p2 = arr2;
int* arr3[2] = {p1, p2};