求大牛解决c语言指针的强制转化问题!!!!!加上(short *)有什么用?
是这样的,c语言中,32-bit系统int和float虽然都占4个字节,
但是他们在内存中的存储方式是不一样的。
int型的3在内存中32-bit 16进制是0x00000003
float型的3在内存中32-bit 16进制是0x40400000
当你把指针v(原本指向int型)强制转换指向float型时,
取值是根据float型方式去取值,所以是以float的内存存储方式解释,
所以pi在内存的值即3以float型解释的话就变成:
1.000 0000 0000 0000 0000 0011e-127.
再取整的话显然是0. 所以输入结果变成了0.
float在内存中的存储方式可以参考:
http://blog.csdn.net/yezhubenyue/article/details/7436624
希望对你有帮助。
int *p=(int *)0x
这个是将指针变量p指向一个绝对地址
而地址只是一个数值,需要转成指针类型才能与p匹配
更多的是给编译器用的。
在C里面对指针不同类型相互赋值做的要求级别并不高
当源类型和目标类型不匹配时只是报一个warning, 而C++里面就是错误了。
比如你这个 正确做法应该是
p=(char *)&a;
至于为什么要加强制转换, 其最根本的原因是
不同类型的指针,进行相互赋值的时候是很容易出现越界的。比如char *p, 这个指针可能只指向一个字节的单元,(char c; p=&c;这样), 如果赋值给int*q=p; 然后按照*q去赋值取值,就是绝对的越界操作。
对于编程中,如果不小心写错了,那么就会引起不可预知后果,甚至可能是你运行测试几十次都正常,但真正出成品了,到客户手里莫名其妙的出错,查起来超难。
所以要求加强制转换,就是为了避免这样的不小心。 人性化一点的说,就是告诉编译器,我知道我在不同类型之间赋值,我已经知道了这样做的后果,也已经确定了可以承担这个后果,你不要管我了。 于是编译器就不管了,后果嘛,自负。
c语言,二重指针的赋值问题
给你仔细分析下哈:首先,指针p是个二重指针,说白了就是它的值是另外一个int型指针变量的地址 截止到你问的那行,现在我们已知a的值是100,假设a的地址是0x1290F54C,pt的地址是0x7FCA6513,pt的值未知(野指针,值是什么都有可能),p也是野指针 如果没有你注释的那一句,*p意味着要取p指向...
学c语言有哪些值得看的书?
c语言实际是最为容易的语言,之所以很多人觉得c难学,实际不是c语言本身的问题,是因为计算机其他基础不扎实的缘故,如计算机原理不扎实自然会觉得指针非常难以理解,没有操作系统完整的知识自然不会理解文件操作:这些不正是大家所说的c难点吗?我自己使用c超过20年(之前近十年用汇编),80年代大学没有c...
...的蛇可是左右显示和上下显示不一样,,求大牛解决。。。给点意见...
前面定义的是结点和食物,然后while循环一直运行,然后,里面要是和食物的位置一样就添加,就这么简单.while(pt->next!=NULL)pt=pt->next ;p->pre= pt;pt->next = p;p->next=NULL;rear=p;
C语言的编程菜鸟,求大牛帮忙找找错
而且,你的sqrt里面用了float的乘法。所以如果数比较大的时候会出错的。建议将乘积的平方根拆成平方根的乘积,因为这两种方式结果一样。比如:4*9的平方根等于4的平方根乘以9的平方根。include <stdio.h> include<math.h> int main(){ double a,b,c,s,area;printf("Input a,b,c:");scanf(...
C语言这么厉害,它自身又是用什么语言写的?编写过程被称为自举
还是以C语言为例,第一个版本可以先选择C语言的一个子集,例如只支持基本的数据类型,流程控制语句,函数调用... 我们把这个子集称为C0。然后用汇编语言写个编译器,只搞定这个语言的子集C0,这样写起来就容易不少。C0这个语言可以工作了,然后我们扩展这个子集,例如添加struct,指针... ,把新的语言...
C语言选择排序题,请大牛帮忙
include<stdio.h> int main(){int i,j,n,k,t,a[100];for(n=0;scanf("%d",&a[n])>0;n++);for(i=n-1;i>0;i--){k=i;for(j=i-1;j>=0;j--)if(a[j]>a[k])k=j;{t=a[i];a[i]=a[k];a[k]=t;} for(j=0;j<n-1;j++)printf("%d,",a[j]);printf("...
谭浩强的C语言程序设计快学完了,接下来该学哪本书。
建议你刚刚学完C不要看那些技术含量比较有深度的书,比如《C陷阱与缺陷》、《c与指针》之类的书。因为潭老的书太基础了,C语言的很多内容都没有讲到,直接看这些书太早,看也看不明白的。应该先把C语言学完全学扎实,了解C语言方方面面的知识,C primer plus 就很不错,我买的是中文第5版,里面对...
C语言选择排序题请大牛回答
include<stdio.h>#include<malloc.h>void change(int p[],int n);int main(){ int *p,n; int i,j; printf("输入数值元素的个数"); scanf("%d",&n); p=(int *)malloc(n*sizeof(int)); for(i=0;i<n;i++) scanf("%d",&p[i]); printf("输入的元素是:\\n"); for(j=...
求C语言大牛!!!expected ';' before 'for'用Code::Blocks编译的_百度...
printf("I am a ")这句后面没有“;”。。。
学软件工程专业,难吗?
我就是学软件工程的,怎么说呢,其实所有的专业都一样,没有什么特别好学,没有什么特别难学,你只要认真学习,就挺简单的。本专业的主要课程:计算机导论、面向对象程序设计、数据结构、算法设计与分析、离散数学、计算机组成与结构、操作系统、计算机网络、数据库系统概论、软件工程经济学、软件工程概论、...
第钓三七: 指针的强制转换 并不影响最终的结果 更多的是给编译器用的.在C里面对指针不同类型相互赋值做的要求级别并不高 当源类型和目标类型不匹配时只是报一个warning, 而C++里面就是错误了.比如你这个 正确做法应该是 p=(char *)&a; 至于...
莱西市18644055361: c语言指针强制转换 - ?
第钓三七: 1、int *p=(int *)0x 这是将指针变量p指向一个绝对地址;而地址只是一个数值,需要转成指针类型才能与p匹配.2、强制类型转换的一般形式为:(类型说明符)(表达式),例如: (float) a 把a转换为浮点型,(int)(x+y) 把x+y的结果转...
莱西市18644055361: C语言中指针强制转换赋值 - ?
第钓三七: 你这样理解是有问题的,你应该知道&的优先级是高于类型转换的,所以是先取指针,然后再强制转换为你需要的类型.例如第一句,Rcs9000_ram_port_flag必然是在前面定义为RCS9000_PORT_FLAG*类型,但后面的&g_Prot_flag[port_no]肯定在前面定义的并不是此类型,安全起见应该先将此指针转换为RCS9000_PORT_FLAG*类型然后再赋值.假如&g_Prot_flag[port_no]为char类型,那么指针加1的时候则移动一个字节(即指向下一个8位数据),假如RCS9000_PORT_FLAG*类型为int类型(假设是32位系统,即int为32位),则强制转换后按32位移动指针.
莱西市18644055361: 指针强制转换高手进来下 - ?
第钓三七: 不是强制转换为“MyThreadData结构体” 而是强制转换为“指向MyThreadData结构体的指针”请注意(MyThreadData*)里面有一个星号.注意C语言中的“地址”概念(也就是“指针”概念)和汇编语言中的“地址”概念有所不同. 汇编...
莱西市18644055361: C语言指针中怎样强制转换变量类型? - ?
第钓三七: 在前面用括号将要转换成的数据类型括起来,即(要转换的类型)待转换的变量…表达能力有限
莱西市18644055361: C语言,指针转换问题 - ?
第钓三七: 内存对齐的缘故.p_buf 作为一个指针,它的值是内存的某个字节的地址.如果想要把 p_buf 强制转换成一个 unsigned int*类型的指针, 需要满足一个必要条件,就是 p_buf 的值必须能够被4整除.(之所以是4,是因为 unsigned int 是要占4个字节的) 所以你的做法会崩溃的.
莱西市18644055361: C语言空指针强制类型转换 - ?
第钓三七: 你这样p的类型依然是 void *.要新声明一个char* char * q = (char*)p;
莱西市18644055361: C语言指针中怎样强制转换变量类型??
第钓三七: 在变量的前面加上强制转换符号就可以了,比如要讲变量a转换层整形可以这样写(int)a
莱西市18644055361: c语言空指针void*赋值struct,结构强制转换问题 - ?
第钓三七: 所谓空指针类型,就是说这个指针是无数据类型的指针,空指针data,它起的作用就是存放的是某个内存单元(也就是内存中某个字节,因为内存一般是按字节来编址的)的地址,由于空指针data没有初始化,那么它的指向是不确定的(即它存放的地址值是个未知数,我们不知道是谁的地址,这样的指针我们称为野指针),你把这个不确定的地址强制转化后赋值给结构体指针变量temp,赋值语句本身没有什么语法错误,你把这个地址打印出来也是没有什么问题的,但是如果你对这个地址的内存单元进行赋值操作,修改了这个内存单元的内容,那么可能会造成严重的后果.比如说这个地址所属的内存单元是操作系统的,你修改它的值,就有可能造成死机的后果.
莱西市18644055361: C语言问题,如何将一个CHAR型指针,转换成一个CHAR[64]的指针 - ?
第钓三七: char *p; char(*p2)[64]=(char(*)[64])p; //强制转换