数码之家

 找回密码
 立即注册

QQ登录

只需一步,快速开始

微信登录

微信扫一扫,快速登录

搜索
查看: 2685|回复: 6

[C51] 指针乘法运算出错,求解释原因

[复制链接]
发表于 2021-4-7 21:38:16 | 显示全部楼层 |阅读模式

爱科技、爱创意、爱折腾、爱极致,我们都是技术控

您需要 登录 才可以下载或查看,没有账号?立即注册 微信登录

x
本帖最后由 广东梁百万 于 2021-4-7 21:47 编辑

C51单片机,初学C语言,做了指针的上机验证,程序以下——
我在按键那每按一次就执行一次下面其中一个指针测试函数,执行后在LCD1602那显示出变量 c 的值,
运算目的是 c = a * b  ,只是我用指针 指向 a  b  c 作运算
第1次  指针测试函数2 执行后,c的值是9,  再按一次键 重复执行一次,  c的值是27,再一次 是63   ,再一次 是  135  ,  ..........这明显是错误。
指针测试函数3 和指针测试函数4,得到的值始终是6, 这个正确。

那  指针测试函数2  到底是哪里出问题?  求解,谢谢。

          unsigned char a=2;
          unsigned char b=3;
          unsigned char c=0;

          unsigned int *DPTR1;           //指针1
          unsigned int *DPTR2;           //指针2
          unsigned int *DPTR3;           //指针3

//--------------------------------
//--------------------------------

                        void testDPTR2()  //指针测试函数2

                   {
                         DPTR1=&a;
                         DPTR2=&b;
                         DPTR3=&c;

                        *DPTR3 = (*DPTR1) * (*DPTR2);
                        }

//--------------------------------

                        void testDPTR3()  //指针测试函数3

                   {
                         DPTR1=&a;
                         DPTR2=&b;
                         DPTR3=&c;

                        *DPTR3 = a * (*DPTR2);
                        }
//--------------------------------

                        void testDPTR4()  //指针测试函数4

                   {
                         DPTR1=&a;
                         DPTR2=&b;
                         DPTR3=&c;

                        *DPTR3 = (*DPTR1) * b;
                        }


发表于 2021-4-8 07:55:43 | 显示全部楼层
广东梁百万 发表于 2021-4-7 22:34
原来如此,我刚把两者都改为同是int 或同是char,  再执行   //指针测试函数2   确实得到正确的值,
但是 ...

哈哈,为啥加法对呢。一步一步分析:
最初内存中是这个样子:0x02,0x03,0x0
(*DPTR1)=0x0302
(*DPTR2)=0x0003
加起来=0x0305,所以(*DPTR3)=0x0305,此时内存中是:0x02,0x03,0x05,0x03
所以c=(*DPTR3)=0x05
所以加法碰巧对了

打赏

参与人数 1家元 +8 收起 理由
广东梁百万 + 8 歡迎探討

查看全部打赏

回复 支持 反对

使用道具 举报

发表于 2021-4-8 01:06:58 | 显示全部楼层
指针我也学不好,看到这帖子想起来电脑的c语言指针本身都是32位固定,int /char是指向的类型
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-4-7 22:34:48 | 显示全部楼层
orsonzou 发表于 2021-4-7 22:21
你用int指针指向的char
类型错了

原来如此,我刚把两者都改为同是int 或同是char,  再执行   //指针测试函数2   确实得到正确的值,
但是此前没改时,执行加法    *DPTR3 = (*DPTR1) + (*DPTR2);   得到的值是正确
回复 支持 反对

使用道具 举报

发表于 2021-4-7 22:31:09 | 显示全部楼层
很明显,你用指针做乘法的时候,编译系统是按int进行的
结果就成了 0x0203 * 0x0300 = 0x60900 ,
高位6别丢弃, 把 0x0900 放到 *DPDR3

打赏

参与人数 1家元 +20 收起 理由
广东梁百万 + 20 精彩回帖

查看全部打赏

回复 支持 反对

使用道具 举报

发表于 2021-4-7 22:21:27 | 显示全部楼层
你用int指针指向的char
类型错了

打赏

参与人数 1家元 +20 收起 理由
广东梁百万 + 20 精彩回帖

查看全部打赏

回复 支持 反对

使用道具 举报

发表于 2021-4-7 22:13:23 | 显示全部楼层
指针定义错误,应该定义为:
unsigned char *DPTR1;
unsigned char *DPTR2;
unsigned char *DPTR3;
即表示该指针是指向char型的变量。

打赏

参与人数 1家元 +20 收起 理由
广东梁百万 + 20 精彩回帖

查看全部打赏

回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册 微信登录

本版积分规则

APP|手机版|小黑屋|关于我们|联系我们|法律条款|技术知识分享平台

闽公网安备35020502000485号

闽ICP备2021002735号-2

GMT+8, 2025-6-19 03:35 , Processed in 0.140400 second(s), 13 queries , Redis On.

Powered by Discuz!

© 2006-2025 MyDigit.Net

快速回复 返回顶部 返回列表