指针和内存单元
内存单元:计算机中内存最小的存储单位,大小是一个字节
指针:就是地址
定义和使用
int a = 10;
int *p = &a;
初始化必须是用地址给它初始化
使用:*p = 250 //指针的解引用/间接引用
*p:将p 变量的内容取出,当成地址看待,找到该地址对应的内存空间
如果做左值:存数据到空间中
如果做右值:取出空间中的内容
野指针、空指针
void *:万能指针/泛型
指针的大小与类型无关,只与当前使用的平台架构有关
为了杜绝野指针,有了空指针
int *p = NULL
....
if(p != NULL){
*p = 300;
printf(xxxxxx)
}
*p时p对应的存储空间一定是一个无效的访问区
野指针:1、没有一个有效的地址空间的指针
int *p;
*p = 1000;
严重性 代码 说明 项目 文件 行 禁止显示状态
错误 C4700 使用了未初始化的局部变量“p” day05 c:\users\administrator\documents\visual studio 2015\projects\day05\day05\野指针和空指针cpp.cpp 11
2、p变量有一个值,但该值不是可访问的内存区域
int *p = 10;
*p = 2000;
0-255这块地址是确定留给操作系统的,会出现写入权限错误
指针必须要用地址来赋值
【杜绝野指针】
泛型指针void *
数组和指针
数组名是地址常量——它不可以被修改,也就是说不可以被赋值
指针是变量,可以用数组名给指针赋值
取数组元素:a【2】本质上就是*(a+2)
取数组元素
int *p
int arr[] = {1,3,5,7,9}
arr[0] == *(p+0) == p[0] ==*(p+0)
const修饰指针
const int a = 5;
int *p = &a;
*p = 650;
const int p;
可以修改p,但是不能修改p
int const p;
同上
int * const p;
可以修改p,但是不能修改p
const int *const p;
两个都不能改了
总结:const向右修饰,被修饰的部分即为只读
常用在函数形参内,用来限制指针所对应的内存空间为只读
指针和数组区别
1、指针是变量,数组是常量
2、sizeof(指针) ==> 4/8 取决于平台
sizeof(数组) ==》数组的实际大小
3、指针++的操作:
a[0] == *(a+0)这里的a是常量是不动的,所以要取元素的话,得向后移
int *p = a;
*p == (p+0) == p[0] == a[0]
p++ p是变量,是可以动的,p++了之后就指向了下一个元素,要取出来的话直接p就行了