casio1374633

导航

 

这个地方我小小的记录一下,虽然这种用法很彪悍,也不被推荐,不过还是记录一下:
起因来自这么一个小示例:

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

posted on 2013-04-28 09:09  casio1374633  阅读(211)  评论(0)    收藏  举报