指针类型的意义:
1、指针类型决定了指针解引用操作时能够访问内存空间的大小;
举例:
- #include <stdio.h>
- int main()
- {
- int a = 0x22334455; //16进制
- //int* p = &a; //int*为指针类型
- //*p = 0;
- char* p1 = &a; //指针类型为char*
- *p1 = 0;
- /*printf("%p\n", p);
- printf("%p\n", p1);*/
- return 0;
- }
char* p1: *p1能够访问1个字节的内存空间;
short* p: *p能够访问2个字节;
int* p: *p能够访问4个字节;double* p: *p能够访问8个字节;
char* p1: *p1能够访问1个字节的内存空间;图解如下:
2、指针+ - 整数
指针类型决定了指针向前或者向后移动了多大的距离(步长),单位:字节;
char* p: p+1移动一个字节;
int* p: p+1移动4个字节;
double* p: p+1移动8个字节;
举例:
- int main()
- {
- int a = 0x123123; // 0x123123是16进制刚好是8个字节
- int* p1 = &a;
- char* p2 = &a;
- printf("%p\n", p1);
- printf("%p\n", p1 + 1);//int*类型:p+1向后移动4个字节
- printf("%p\n", p2);
- printf("%p\n", p2 + 2);//char*类型:p+2向后移动2个字节
- return 0;
- }
图解如下:
3、通过指针改变数组元素的值:
举例:
- #include <stdio.h>
- int main()
- {
- int arr[10] = { 0 };
- int* p = arr; //arr是数组名,p指向数组元素的首地址
- int i = 0;
- for (i = 0; i < 10; i++)
- {
- *(p + i) = 1;
- printf("%d ", arr[i]);
- }
- return 0;
- }
执行结果如下:
4、野指针(随机值,不确定的值);
导致野指针的三种情况:
指针未初始化导致野指针;
指针越界导致野指针;
指针指向的空间被释放了,导致野指针;
指针未初始化导致野指针; 举例如下:
int main()
{
int a; //局部变量不初始化,默认值是随机值
//int* p; //局部指针变量不初始化,默认值就是随机值,这种情况是不允许的;//*p =10;
return 0;
}
指针越界导致野指针; 举例如下:
int main()
{
int a[5] = { 0 };
int* p = &a;
int i = 0;
for (i = 0; i < 8; i++)
{
//*(p+i) = 1; //当i=6,7,8时,指针超出了数组a的范围,越界了,这种情况是不允许的;
}
return 0;
}
指针指向的空间被释放了,导致野指针;举例如下:
int* test()
{
//进入test函数后,系统给int a分配内存地址,
//但是出了函数后,int a的地址被销毁了
int a = 2;
return &a;
}
int main()
{
//进入test函数后,系统给int a分配内存地址,
int* p = test();//但是出了函数后,int a的地址被销毁了,导致*p的地址随机,变成野指针
*p = 8;
return 0;
}