指针类型的意义:
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;
}