一个关于指针的疑问
我们可以写:char *p="abc";
谁也没觉得有什么不对
可是如果写:int *p=(int *)1;呢?
1和"abc"都是常量吧?"abc"表示地址,把1转成地址了还是不行?
问题点数:20、回复次数:5Top
1 楼megaboy(飞天御剑流之杀神一刀斩)回复于 2006-03-03 19:21:50 得分 0
int *p=(int*)1;在语法上是没有错误的,但两者有一个根本性的区别,"abc"是一个实际并且被定义的对象,一个合法的对象,而(int*)1并没有产生对象,也就是说int *p=(int*)1;运行之后,p所指向的是一个非法对象,一个没有被实际定义的对象。Top
2 楼casazaft()回复于 2006-03-03 19:55:45 得分 0
很简单 char *p="abc"
汇编代码可能是
对于字符窜"abc" 可能会如下处理
temp db 'a','b','c'
在内存中分配了一个相当于temp的变量,实际会是一个内存地址,比如[1234h]
*p也会分配到一个地址,比如可能是[1500h],并且在这个地址的内存里写入1234h,完成了“指针“的生成和指向
而int *p=(int *)1会依据优先级,首先对等号右边的括号进行运算,试图分配一个地址来做指针,并在这个地址里存入1的地址----然而1实际保存在寄存器中,不出现在内存里,无法完成取指操作,必然出错
Top
3 楼Tiwen818(Tiwen)回复于 2006-03-03 21:09:56 得分 0
"abc"在编译的过程中已经分配好地址存储。是合法对象。Top
4 楼hai_li(何家干)回复于 2006-03-03 23:31:15 得分 0
"abc"是一个字符串常量,代表地址,在内存的全局变量区中有它的存储位置,所以可以这样。
1是数组常量,在内存中没有它的空间Top
5 楼tramp0515()回复于 2006-03-05 04:43:01 得分 0
同意楼上的朋友~Top




