关于指针在函数中的调用
2014-03-09 12:53
274 查看
2014-2-19
问题:定义函数f(),其形参是float型,现在想通过函数f()调用先前定
义的整型数,通过调试总结出如下一些经验,有的地方尚需要确定。
#include "stdio.h"
#include "stdlib.h"
#define N 8
float Buf
;
unsigned int *Ptr;
void f(float x
)
{
int i;
for(i=0;i
{
x[i]=x[i]*i;
printf("%f\n",x[i]);
}
}
void main(void)
{
int i;
Ptr=NULL; //NULL在文件stdio.h中定义过。
Ptr=(unsigned int *)malloc(N*sizeof(int)); //注意一定是要开辟N个int型的字节长度,不然编译会出错。
//printf("%ld\n",Ptr);
for(i=0;i
{
*(Ptr+i)=i;
}
for(i=0;i
{
Buf[i] = *(Ptr+i);
}
//下面调用函数f 处理外部RAM中的数
f((float *)(Ptr)); //请问:这样调用函数有问题吗?
//f(Buf); //这样调用则不会有问题。
}
说明:若这样调用函数:f((float *)(Ptr)),则输出结果如下图A1:
A1
若这样调用函数f(Buf),则输出如下图A2所示:
A2
这说明像f((float *)(Ptr))这样调用函数是有问题的,具体原因就慢慢体会吧,我暂时也不能明确道出个所以然来。
后来我又调试发现:如果存储的时候也是定义Ptr为float型指针的,那么输出时调用f((float *)(Ptr))便可正确输出结果,而存储时是以unsigned
int型指针存储的,则调用的时候应该这样调用:f((*unsigned
int *)Ptr) 。
2014-2-22
对于上述问题,后来我又想到是否可以通过结构体来定义对应的变量,结果还是不行。
#include "stdio.h"
#define N 8
union BufRam
{
unsigned int IntRam;
float FloatRam;
}Buf
;
void f(float x
)
{
int i;
for(i=0;i
{
x[i]=x[i]*i;
printf("%f\n",x[i]);
}
}
void main(void)
{
int i;
for(i=0;i
{
Buf[i].IntRam=i;
}
for(i=0;i
{
//Buf[i].FloatRam=Buf[i].IntRam; //若增加这条语句,则下面的处理即可成功了。
}
//下面调用函数f 处理外部RAM中的数
f(&(Buf[0].FloatRam)); //请问:这样调用函数有问题吗?
}运行结果同上图A1,
若调用程序中的这条语句Buf[i].FloatRam=Buf[i].IntRam,则运行结果同上图A2。
这说明即使是定义结构体类型也是不行的啊,因为整型变量与浮点型变量的存储结构是不同的,这一点是我经过多天的理解自己得出的,其可靠性尚需要确定。
问题:定义函数f(),其形参是float型,现在想通过函数f()调用先前定
义的整型数,通过调试总结出如下一些经验,有的地方尚需要确定。
#include "stdio.h"
#include "stdlib.h"
#define N 8
float Buf
;
unsigned int *Ptr;
void f(float x
)
{
int i;
for(i=0;i
{
x[i]=x[i]*i;
printf("%f\n",x[i]);
}
}
void main(void)
{
int i;
Ptr=NULL; //NULL在文件stdio.h中定义过。
Ptr=(unsigned int *)malloc(N*sizeof(int)); //注意一定是要开辟N个int型的字节长度,不然编译会出错。
//printf("%ld\n",Ptr);
for(i=0;i
{
*(Ptr+i)=i;
}
for(i=0;i
{
Buf[i] = *(Ptr+i);
}
//下面调用函数f 处理外部RAM中的数
f((float *)(Ptr)); //请问:这样调用函数有问题吗?
//f(Buf); //这样调用则不会有问题。
}
说明:若这样调用函数:f((float *)(Ptr)),则输出结果如下图A1:
A1
若这样调用函数f(Buf),则输出如下图A2所示:
A2
这说明像f((float *)(Ptr))这样调用函数是有问题的,具体原因就慢慢体会吧,我暂时也不能明确道出个所以然来。
后来我又调试发现:如果存储的时候也是定义Ptr为float型指针的,那么输出时调用f((float *)(Ptr))便可正确输出结果,而存储时是以unsigned
int型指针存储的,则调用的时候应该这样调用:f((*unsigned
int *)Ptr) 。
2014-2-22
对于上述问题,后来我又想到是否可以通过结构体来定义对应的变量,结果还是不行。
#include "stdio.h"
#define N 8
union BufRam
{
unsigned int IntRam;
float FloatRam;
}Buf
;
void f(float x
)
{
int i;
for(i=0;i
{
x[i]=x[i]*i;
printf("%f\n",x[i]);
}
}
void main(void)
{
int i;
for(i=0;i
{
Buf[i].IntRam=i;
}
for(i=0;i
{
//Buf[i].FloatRam=Buf[i].IntRam; //若增加这条语句,则下面的处理即可成功了。
}
//下面调用函数f 处理外部RAM中的数
f(&(Buf[0].FloatRam)); //请问:这样调用函数有问题吗?
}运行结果同上图A1,
若调用程序中的这条语句Buf[i].FloatRam=Buf[i].IntRam,则运行结果同上图A2。
这说明即使是定义结构体类型也是不行的啊,因为整型变量与浮点型变量的存储结构是不同的,这一点是我经过多天的理解自己得出的,其可靠性尚需要确定。
相关文章推荐
- 关于指针的一些事情
- Linux C函数参考手册(PDF版)
- Mootools 1.2教程 函数
- autoit InputBox 函数
- 文件遍历排序函数
- Oracle 函数大全[字符串函数,数学函数,日期函数]第1/4页
- ASP下经常用的字符串等函数参考资料
- asp Chr 函数 数字转字母的方法
- 探索PowerShell(十一)函数介绍
- vbscript LoadPicture函数使用方法与漏洞利用
- vbs 中调用shell.application 简单函数
- Asp函数介紹(37个常用函数)第1/2页
- C#实现打造气泡屏幕保护效果
- phplib中的一些基本语法和函数
- C/C++数据对齐详细解析
- C++中引用的使用总结
- C与C++之间相互调用实例方法讲解