//指针就是变量,用来存放地址的变量。存放在指针中的值被当作地址处理
//不同操作系统为地址划分空间大小
//32位机器有32根地址线,地址用4个字节的空间存储,指针变量大小就为4个字节
//64位机器有64根地址线,地址用8个字节的空间存储,指针变量大小就为8个字节
//指针区分类型的意义:
//所有类型的指针都能够完整存放其它类型的指针数据
//但是在更改该类型的值时,按照该类型修改
//例如 int型修改4个字节的值,而char型只修改1个字节的值
//对指针加减就是将地址向后向前移动该类型大小字节,类型决定指针的步长
//野指针,指向的位置不可控制不可知
//指针在定义时需要对其初始化,不然就是野指针,一定要避免 int* p;
//指针越界,就是访问了不归它管的地址也是野指针 int arr[10]; int* p = arr; p>>12,错误
//指针指向的内存地址被释放了,也会被归为野指针,一般在指针函数里
//规避野指针
//1.对指针初始化,可以为空指针NULL = ((void *)0)
//2.防止指针越界
//3.指针使用前检查是否有效
//4.地址被释放了指针置为空指针
//对指针的操作
//指针+-整数 位移
//指针-指针 得到两个指针之间的元素个数(大减小)(同一块空间内的)
//指针位运算
//指针类型的意义
int main()
{
int a = 0x11223344;
int b = 0x55667788;
int* pa = &a;
char* pb = &b;
*pa = 0; //将11223344改为00000000;修改4个字节
*pb = 0; //将55667788改为55667700;修改1个字节
return 0;
}
//指针越界,成为野指针
int main()
{
//int* pa; //初始化未定义指针,直接成为野指针
int arr[10] = { 0 };
int* p = arr;
int i = 0;
for (i = 0; i < 12; i++)
{
*p = i;
p++;
}
return 0;
}
//内存被释放成为野指针
int* test()
{
int a = 10;
return &a; //地址在返回时被释放
}
int main()
{
int* p = test(); //记住的地址对应的临时变量已经被销毁了
printf("%d\n", *p);//当再用该地址访问时已经不正确了,可能已经被分配给其它数据了
return 0;
}