找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1332|回复: 9
收起左侧

关于C51单片机编程中地址覆盖的请教

[复制链接]
ID:607146 发表于 2019-9-9 22:51 | 显示全部楼层 |阅读模式
我一一段代码如下

unsigned char *p;  //声明一个指针变量
p="123";    //赋值123给这个指针上,假定地址为0x09CE,此时0x09CE被赋值了0x31,0x09CF为0x32
*p='9';      //我想把 0x09CE覆盖为0x39
此时查看0x09CE还是0x31,并没有被覆盖,这是怎么回事。如果这种方式是错的我应该怎么覆盖这个地址上的值。谢谢

回复

使用道具 举报

ID:478885 发表于 2019-9-10 07:56 | 显示全部楼层

*p='9';  改为*p=39;0x09CE被覆盖为0x39了
回复

使用道具 举报

ID:94031 发表于 2019-9-10 08:32 | 显示全部楼层
既然用c语言就不要纠结具体物理地址,如果对物理地址很在乎就用汇编好了,典型由汇编初转c者心态。。
回复

使用道具 举报

ID:607146 发表于 2019-9-10 09:27 | 显示全部楼层
swzh 发表于 2019-9-10 07:56
*p='9';  改为*p=39;0x09CE被覆盖为0x39了

试过了用*p=0x39也是不行的
回复

使用道具 举报

ID:607146 发表于 2019-9-10 09:33 | 显示全部楼层
xuyaqi 发表于 2019-9-10 08:32
既然用c语言就不要纠结具体物理地址,如果对物理地址很在乎就用汇编好了,典型由汇编初转c者心态。。

刚开始学C51,是因为使用system.h的strcat函数拼接字符串,发现不能拼接。看了strcat实现方式

char* Strcat(char *dst, const char *src)
{
        assert(dst != NULL && src != NULL);
        char *temp = dst;
        while (*temp != '\0')
                temp++;
        while ((*temp++ = *src++) != '\0');

        return dst;
}

发现*temp++ = *src++这个执行了但并没有真正的把*src赋值给*temp。所以才有的这个疑问。
回复

使用道具 举报

ID:123289 发表于 2019-9-10 11:51 | 显示全部楼层
0x09CE是RAM地址还是程序地址呢?
回复

使用道具 举报

ID:15020 发表于 2019-9-10 13:09 | 显示全部楼层
unsigned char *p;  //声明一个指针变量
p="123";    //这句改的是p指向的地址
*p='9';      //这句改的是p所指地址的数据
两句作用是不一样的,p前的*号很重要
回复

使用道具 举报

ID:607146 发表于 2019-9-10 14:17 | 显示全部楼层
yzwzfyz 发表于 2019-9-10 11:51
0x09CE是RAM地址还是程序地址呢?

RAM地址
回复

使用道具 举报

ID:607146 发表于 2019-9-10 14:18 | 显示全部楼层
yutian_51hei 发表于 2019-9-10 13:09
unsigned char *p;  //声明一个指针变量
p="123";    //这句改的是p指向的地址
*p='9';      //这句改的 ...

你好,我想实现先对地址赋一个值然后再用另一个值覆盖的话应该怎么写呢?
回复

使用道具 举报

ID:610106 发表于 2019-9-10 17:04 | 显示全部楼层
此时p指向的是只读数据吧
回复

使用道具 举报

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

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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