整数当作一个地址赋给一个指针:
例十六:
int a=123,b;
int *ptr=&a;
char *str;
b=(int)ptr;//把指针ptr的值当作一个整数取出来 。
str=(char*)b;//把这个整数的值当作一个地址赋给指针str 。
好了 , 现在我们已经知道了 , 可以把指针的值当作一个整数取出来 , 也可以
把一个整数值当作地址赋给一个指针 。
第九章 指针的安全问题
看下面的例子:
例十七:
char s=’a’;
int *ptr;
ptr=(int*)&s;
*ptr=1298;
指针ptr是一个int*类型的指针 , 它指向的类型是int 。它指向的地址就是s的
首地址 。在32位程序中 , s占一个字节 , int类型占四个字节 。最后一条语句不但
改变了s所占的一个字节 , 还把和s相临的高地址方向的三个字节也改变了 。这三
个字节是干什么的?只有编译程序知道 , 而写程序的人是不太可能知道的 。也许
这三个字节里存储了非常重要的数据 , 也许这三个字节里正好是程序的一条代码
, 而由于你对指针的马虎应用 , 这三个字节的值被改变了!这会造成崩溃性的错
误 。
让我们再来看一例:
例十八:
1. char a;
2. int *ptr=&a;
...
...
3. ptr++;
4. *ptr=115;
该例子完全可以通过编译 , 并能执行 。但是看到没有?第3句对指针ptr进行
自加1运算后 , ptr指向了和整形变量a相邻的高地址方向的一块存储区 。这块存储
区里是什么?我们不知道 。有可能它是一个非常重要的数据 , 甚至可能是一条代
码 。而第4句竟然往这片存储区里写入一个数据!这是严重的错误 。所以在使用指
针时 , 程序员心里必须非常清楚:我的指针究竟指向了哪里 。
在用指针访问数组的时候 , 也要注意不要超出数组的低端和高端界限 , 否则
也会造成类似的错误 。
在指针的强制类型转换:ptr1=(TYPE*)ptr2中 , 如果sizeof(ptr2的类型)大
于sizeof(ptr1的类型) , 那么在使用指针ptr1来访问ptr2所指向的存储区时是安
全的 。如果sizeof(ptr2的类型)小于sizeof(ptr1的类型) , 那么在使用指针ptr1
来访问ptr2所指向的存储区时是不安全的 。至于为什么 , 读者结合例十七来想一
想 , 应该会明白的 。
推荐阅读
- 华为交换机SVF介绍
- 茶多酚含量排行哪些因素会影响鲜叶的茶多酚含量
- 过期茶叶的八大妙用扔掉了又怪可惜的
- 怎样搭高质量的Android项目框架,框架的结构具体描述?
- 茶叶多少钱斤算好的 依据个人经济能力和不同的口味进行选择
- JS刷新当前页面的几种方法总结
- 蒸茶和煮茶的区别蒸茶壶和煮茶壶使用时的区别
- 初识JS中的作用域和闭包
- 建水紫陶壶有哪些缺点由于建水紫陶壸特殊的材质
- SEM跳出率高怎么办?