作业帮 > 综合 > 作业

帮忙看下这个函数,C语言!传递给函数的是啥?

来源:学生作业帮 编辑:搜搜做题作业网作业帮 分类:综合作业 时间:2024/08/08 16:33:18
帮忙看下这个函数,C语言!传递给函数的是啥?
void DrawPicture_Center(u16 *PictureAddr)
这个是函数的prototype定义
用的时候,写法很奇怪:DrawPicture_Center((u16 *)picture1);
就是实在是不知道(u16 *)picture1这种表达方式是什么,如果没有括号,变成
u16 *picture1 那么是16位的名字叫picture1 的 array,但显然不能这么用.
帮忙看下这个函数,C语言!传递给函数的是啥?
你的picture1不是u16*类型,可能是u8*类型,要传给DrawPicture_Center做参数,需要转换成u16*类型.如果你不加类型转换,有的编译器会发出警告,有些甚至直接报错提示.
我们一般使用数值传递,比如:
char a=10;
int fun(int x){}
int main()
{
fun(a);
return 0;
}
这种时候,fun传入的a是char类型,但编译器能够自动进行类型提升,把char升为int数值.这里一般都不会警告或报错.
指针则更严肃,传入的是地址.
再问: 你好,那么8位强制转16位具体怎么操作的呢?高位补零吗?都是无符号的哦! 是不是这样: 原来无符号8位的数字 8: 00001000 强制转换16位后的数字 8:00000000 00001000 ???
再答: 不是,u8连续2个字节,按低8位高8位(Intel格式)这样16位作为一个16位的。你说的那中去情况,是单纯8位数据转16位数据。 现在是指针变量,它本身是一个地址值,u8*则指向空间每一个单元都是u8类型的,u16*则是说指向内存处,每16位表示一个元素。 假设指向地址的数据为(字节序):01 02 05 02 如果按u8*理解,这里有4个u8类型的元素,分别是十进制 1,2,5,2 若是按u16*理解,只有2个u16数据,分别是十进制513(=1+2*256=513)和517(=5+2*256=517)
再问: 谢谢你!最佳答案肯定是你的了,我想问下我的理解正确否: 对指针进行强制转换,实际上是改变了指针的“偏移量”,u8原来是每8bit算一个数据,强制转换成u16后每16bit算一个数据。 因此在u8“看来”,01 0F 是0000 0001 0000 1111,是两个数据,而在u16看来,是00000001 00001111 一个数据,对吧?
再答: 是的,可以这么看待,至少不是错的,也比较好理解 u16类型,还得注意高低字节序,一般有Intel格式和Motorola格式,前者低字节在前,高字节在后;后者则是先高字节,再低字节。很多Motorola的单片机或微处理器都是Motorola格式字节序。