指针的定义与基本使用
指针对数据操作的权限
)
定义及基本使用
指针:指针就是地址。
指针变量:存储的数据类型是指针的变量叫做指针变量。
形式:存储的数据类型 *变量名,eg:char *p;
指针类型的大小:与系统类型和编译器类型有关。eg: 64位系统、64位编译器中 指针是8字节
指针访问数据:非声明状态下,表示解地址,使用p,可以通过指针变量存储的地址访问数据。
tip :
1)指针变量首先是一个变量,他有自己的地址;指针变量可以存储地址,存储的地址就是他需要访问的空间地址;
2)指针类型代表他存储的数据类型,影响从存储的地址开始寻找多长的字节。
3)对某一变量如int a=10; &a取得的是虚拟地址
指针对数据的操作权限
指针对普通地址进行完全权限的访问,如:`
int a=10;
int *p=&a;
*p=12;
printf(“%d %d\n”,a,*p);//输出均为12;
因为a代表的内存和p指向的内存是同一块空间,所以无论是用哪种方法对这块内存中的数据进行操作都直接改变该数据。
指针对数据访问的权限有待更新…
由于操作权限造成的一些错误
- 指针对常量,无法获得其地址
int *p=&10;//这样的操作是非法的
注意:真常量与伪常量
类似于10这样的数值是真常量,此时无法使用指针获取其地址,上述操作会在编译器报错;
类似于“hello”这样的常量字符串是伪常量,可以获取其地址,但不能进行写操作,写操作时发生错误,在运行期报错。
2. 类型不匹配的错误
int a=10;
int *p=&a;
int *s=“hello world”;
p=s;
printf(“%s\n”,p);//虽然可以对数据进行访问,但是数据格式错误,出现乱码(因为p是int指针)
- 对于系统自动分配的只读空间,进行写操作,会造成权限错误,如段错误或总线错误
char *s="helloworld";//s指向的这块空间在静态区,只能读不能写
char *p=s;
*p=100;
printf(“%d\n”,*p);//因为这块空间只能够进行读取,而不能进行存储、修改等操作,此时就会出现段错误或总线错误。
- 指针获得某块内存的地址后,脱离其有效范围后就会成为非法访问。
如使用指针进行局部变量的访问:
if(s[0]=='h')
{
int k=88;
p=&k;
}
printf("%d\n",*p);//k是局部变量,脱离k的适用范围(上面代码块)后,再使用指针访问就会变成非法访问;
//原先的地址空间其实已经得到了释放,这块空间中的数据随时会被其他的数据填充
脱离变量有效的范围后,原先的地址空间其实已经得到了释放,这块空间中的数据随时会被其他的数据填充。指针指向一个已经释放的空间,使用指针访问该空间就是非法访问,导致野指针访问。