浮名此生分享 http://blog.sciencenet.cn/u/hailangww 工学博士

博文

[转载]C语言里指针问题

已有 1044 次阅读 2022-12-15 13:42 |系统分类:科研笔记|文章来源:转载

#define DATA *((Uint16 *)0x100000);

*(&DATA+1) = DATA_B; 

首先 *((Uint16 *)0x100000) 意思 就是 从 地址 0x100000 处 读取 一个 Uint16 类型的 变量,先把 这个变量 记做 x
#define DATA *((Uint16 *)0x100000) // 以后 遇到 DATA 就用 *((Uint16 *)0x100000) 取代;


*(&DATA+1) = DATA_B; //等效于 *(&*((Uint16 *)0x100000)+1) = DATA_B;
含义 是 取x的地址,再+1,再 取指针,这个 变量 记做 y;
由于 x 是 Uint16 类型,占 2个字节,所以 指针 +1 就是 地址+2,于是 &y=0x100002;
那么 *(&DATA+1) = DATA_B; 执行的 结果 就是 地址 0x100002 处 的 数据 = DATA_B;

那么 *(&DATA+1) = DATA_B; 执行的 结果 就是 地址 0x100002 处 的 数据 = DATA_B;

追问

Uint16是usigned int。  我最大的疑问就是怎么理解“*((Uint16 *)0x100000) =从地址0x100000 处读取一个 Uint16 类型的变量”?  一个地址的指针的指针是什么意思呢?

追答

楼主 说 Uint16是usigned int
那么 你 写的 是 单片机程序了。。。因为在 计算机里 Uint16是usigned short

先看 以下2个的区别
((Uint16 *)0x100000) 和((Uint16 )0x100000) 
前者 比 后者 就多一个 *
* 是 指针的 意思
前者 是 有一个 指针,这个指针 指向一个 Uint16 类型的 数;
后者 就是一个数 把0x100000 强制转换为 Uint16  ,结果 是 0x0000;

#define DATA *((Uint16 *)0x100000) 是
定义DATAS指向0x100000地址的一个指针,并且元素占16位(2个字节);
*(&DATA+1) = DATA_B;
将DATA指向的下一个元素(地址是0x100002)赋值为DATA_B;

第一句:将地址在0x00100000这个地方的数据定义为DATA,类型是Uint16
第二句,讲DATA+1这个位置(0x00100002) 的数据赋值为DATA_B




https://m.sciencenet.cn/blog-54347-1367972.html

上一篇:[转载]C语言中*p 和p的区别
下一篇:基于DSP的电机控制子函数

0

该博文允许注册用户评论 请点击登录 评论 (0 个评论)

数据加载中...

Archiver|手机版|科学网 ( 京ICP备07017567号-12 )

GMT+8, 2024-6-2 20:02

Powered by ScienceNet.cn

Copyright © 2007- 中国科学报社

返回顶部