指针定义:指针是一个变量,保存的内容为地址。
int num = 5;
如果系统分配给num的空间为0x1000到0x1003 num的地址就为首字节地址0x1000。0x1000内保存的内容为5。
定义指针p
int* p = #
指针p内保存的内容为num的地址,如果系统给p分配的地址为0x2000,可以得到下图
指向内存空间和对应的内存空间:
num++:对num对应的内存空间的值加1.
p++:对p对应的内存空间的值加1.
(*p)++:对p指向的内存空间加1.
‘ * ’为取值运算符,根据对应内存空间里保存的地址找到其对应的内存空间。
p == &num
*p == num == *(&num)
int *pp = &p;
num == *p == **pp ==*(&num)
p == *pp == &num
int* ppp = &pp;
**ppp == *pp == p == &num
***ppp == **pp == *p == num =*(&num)
int *p; 定义为指针类型为int* 指向int
char *p; 定义为指针类型为char* 指向char
野指针:随机指向一块内存的指针,有可能导致内存泄漏。
内存泄漏:访问一块不可访问或已经释放的内存。
int *p;
scanf("%d",p);
printf("%d",*p);
这里虽然定义了指针,但是未对其进行初始化,系统对未初始化的局部变量分配一个随机的值,所以p指向一个随机的地址,而这个地址系统不一定分配给用户,用户不一定有使用权限,或者有使用权限但已经释放,如果使用此指针就有可能造成内存泄漏。
避免野指针需要给指针赋初值值
int * p = (int * )malloc(sizeof(int));
int * p = NULL;