指针
指针是什么
我们可以这样理解:
总结
- 指针式用来存放地址的,地址是唯一标标示一块地址空间的。
- 指针的大小在32位平台是4字节,在64位平台下是8字节
指针的意义
int main()
{
int a = 0x11536;
int* pc = &a;
char* p = &a;
/*指针任何数据的地址都可以储存,但是解引用操作的时候,指针类型决定了可以访问的空间的大小*/
}
指针±整数
int main()
{
int a = 0x11223344;
int* pa = &a;
char* pc = &a;
printf("%p\n",pa);
printf("%p\n",pa+1);
printf("%p\n",pc);
printf("%p\n",pc+1);
return 0;
}
运行结果
指针类型决定了:指针(向前或者向后)走一步走多远
ex:
int main()
{
int arr[10] = {0};
int* p = &arr;//数组为int类型,需要用的就是int*
int i = 0;
for(;i<9;i++){
*(p + 1 ) = i;
}
return 0;
}
野指针
会报错
1
2
3指针指向的空间释放
int* test()
{
int a = 10;
return &a;
}
//test()方法结束后就会释放返回管理空间,那么&a就会释放,就会导致空间不是空间不是程序自己的,造成野指针
int main()
{
int * p = test();
*p = 20;
return 0;
}
如何规避野指针
- 指针初始化
- 小心指针越界
- 指针指向空间释放即使置null
- 指针使用之前检查有效性
指针的运算
- 指针的±整数
- 指针 - 指针(得到的是中间的元素个数)
指针减去指针的时候,两个指针指向的都是同一个数组,不是指向同一个数组无意义
指针和数组
int main()
{
int arr[10] = {0};
printf("%p\n",arr);
printf("%p\n",&arr[0]);
//这两个都表示的是地址-首元素地址
return 0;
}
注意:
//1.&数组名 --代表的不是首元素数组地址,代表的是整一个数组
//2.sizeof(数组名)代表的也是整个数组
区别:
二级指针
int main()
{
int a = 10;
int * pa = &a;
int* * ppa = &pa;
//二级指针,以此类推还可以有多级指针
//int** * pppa = &ppa;
return 0;
}
示意图:
指针数组 and 数组指针
指针数组 – 数组
数组指针 – 指针
int main()
{
//指针数组 -- 数组
int a = 10;
int b = 20;
int c = 30;
int* arr[3] = {&a,&b,&c};
int i = 0;
for (; i < 3; i++) {
printf("%d ", *(arr[i]));
}
return 0;
}
运行结果: