这个地方我小小的记录一下,虽然这种用法很彪悍,也不被推荐,不过还是记录一下:
起因来自这么一个小示例:
p = (int *)q;
其中: int *p; float *q;
之前看到的是:p = (int *) 777 指的是一个绝对地址;
如果q是一个普通变量,那么就是把q变量的内容传给p,作为一个绝对地址 现在q也是一个指针,下面给一个示例代码:
#include <stdio.h> int main(void) { int *p; float *q; float a = 123; q = &a; p = (int *) q; printf("\n The ans is q = %f p = %d a = %d;\n", *q, *p, (int)a); return 0; }
这个做法等价与下面这个:
#include <stdio.h> int main(void) { int *p; float *q; void *v; float a = 123; q = &a; p = v = q; printf("\n The ans is q = %f p = %d a = %d;\n", *q, *p, (int)a); return 0; }
在gdb的调试过程中也看到, q的内容(a的地址)被复制给了p.在print p和print q中可以看到是一样的地址,但是在print *p和print *q和print a中可以发现.
print *q 和print a 是一样的内容=123,但是print *p却是另一个内容= 1123418112.
这让我觉得不明白,即然p和q指向了同一个地址,那么只是在解地址上面类型不同,按int解a的内容应该和(int)a一样
因为p是int类型指针,a和*p都是float类型,那么p虽然指向同一个地址,但是它读取的只能是4字节的内容,然后按照整形输出,所以读出错误,
如果反过来,p是float,*q和a是int,就很好理解了,虽然p和q指向同一个地址,但是p是float,那么一次读取8字节时候就会内存越界.
不论定义什么类型,一个指针在32位cpu中就是按照4字节分配内存.然后根据类型,指针读取一个数据的字节是变化的.
所以在 char *p = "abc" ;中, p单独分配一个4字节内存,里面放基地址,但是每次只读取1字节内容.q也单独分配一个4字节,里面就算放同样的基地址,但是每次读取4字节.
下面这个例子就说明了:
#include <stdio.h> int main(void) { int *p; char *q = "abc"; p = (int *) q; printf("\n The ans is p = %c p = %d q = %c;\n", *p, *p, *q); return 0; }
读出的就是 p = a , p = 6513249 q = a;
float在内存中存放还是4个字节,但是是IEEE规定的格式,不是简单的int那种存储
(int *) q 仅仅是指针强转
(int)a 从float里提取了整数部分转换成int
浙公网安备 33010602011771号