C语言当中结构句后面一个星号,是什么意思?

Cortex-M3使用CMSIS编程的问题以下是一个嵌入式平台上的代码有如下这些定义:#defineSCS_BASE(0xE000E000)/*!<SystemContr... Cortex-M3使用CMSIS编程的问题
以下是一个嵌入式平台上的代码
有如下这些定义:
#define SCS_BASE (0xE000E000) /*!< System Control Space Base Address */

#define NVIC_BASE (SCS_BASE + 0x0100) /*!< NVIC Base Address */

typedef struct
{
__IO uint32_t ISER[8]; /*!< Offset: 0x000 Interrupt Set Enable Register */
uint32_t RESERVED0[24];
__IO uint32_t ICER[8]; /*!< Offset: 0x080 Interrupt Clear Enable Register */
uint32_t RSERVED1[24];
__IO uint32_t ISPR[8]; /*!< Offset: 0x100 Interrupt Set Pending Register */
uint32_t RESERVED2[24];
__IO uint32_t ICPR[8]; /*!< Offset: 0x180 Interrupt Clear Pending Register */
uint32_t RESERVED3[24];
__IO uint32_t IABR[8]; /*!< Offset: 0x200 Interrupt Active bit Register */
uint32_t RESERVED4[56];
__IO uint8_t IP[240]; /*!< Offset: 0x300 Interrupt Priority Register (8Bit wide) */
uint32_t RESERVED5[644];
__O uint32_t STIR; /*!< Offset: 0xE00 Software Trigger Interrupt Register */
} NVIC_Type;

#define NVIC ((NVIC_Type *) NVIC_BASE) /*!< NVIC configuration struct */

在使用的时候它就这么用:比方说是要给ISER附值,NVIC->ISER=0x85c0;我主要 是不能理解这句:

#define NVIC ((NVIC_Type *) NVIC_BASE)其中这个(NVIC_Type *) 是什么意思?起什么作用的?还有就是这个ISER的地址是0xe000e100
我们写程序的时候为什么不直接写成:
#define ISER (0xE000E100) 然后来一句:ISER=0x85c0;为什么就要这么费劲?定义了那么多东西?它这么做有什么好处?
展开
 我来答
chinaboyzyq
2016-01-27 · TA获得超过1.3万个赞
知道大有可为答主
回答量:1.3万
采纳率:89%
帮助的人:3220万
展开全部
1、定义一个指向结构变量的指针。
2、C语言中的结构体
格式:
struct 结构体标识名
   {
    类型名1 结构成员表1;
    类型名2 结构成员表2;
    „„
    类型名n 结构成员表n;
   };
  注意:struct是关键字,是结构体类型的标志。“结构体标识名”和“结构体成员名”都是用户定义的标识符,“结构体标识名”是可选项,在说明中可以不出现。每个“结构成员表”中都可以含有多个同类型的成员名,它们之间用逗号隔开。结构体中的成员名可以和程序中的其他变量名相同,不同结构体中的成员也可以同名。要记住:结构体说明要以分号结尾。
3、结构指针
结构指针是指向结构的指针。它由一个加在结构变量名前的"*" 操作符来定 义, 例如用前面已说明的结构定义一个结构指针如下:
struct string{
char name[8];
char sex[2];
int age;
char addr[40];
}*student;
也可省略结构指针名只作结构说明, 然后再用下面的语句定义结构指针。
struct string *student;
tattackor
2015-10-31 · TA获得超过3.5万个赞
知道大有可为答主
回答量:5083
采纳率:94%
帮助的人:879万
展开全部

在C语言中使用*号有两种情况。
1、做乘法运算符使用。
在计算机中一般不使用数学的乘号×,而是用更容易打出的*替代。
如果*出现在运算中,且左右都有表达式,那么*就是当做乘号来使用的。
比如:

#include <stdio.h>
int main(){
    printf("%d\n", 3*4);
    return 0;
}

这个程序就是简单的计算3*4的输出,会输出12。

2、定义指针时做标识符。
在C语言中有指针的概念,在定义某个类型的指针时,会采用
TYPE *name;的形式。 具体说明在第三部分中一并叙述。

3、做取值运算符。
对某个指针变量做*操作,表示取该指针指向地址中的值。
在这种情况下*位于所要取值的指针变量前。如*p。
比如:

#include <stdio.h>
int main()
{
   int a=3;
   int *p = &a;//&为取地址 在这里的*是指针定义标识
    
    printf("a = %d\n", a);//输出a的值,为3
    printf("*p = %d\n", *p);//输出*p的值,这里的*是取值运算符。输出结果同样为3
    return 0;
}
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
百度网友0c14fe6
推荐于2017-09-03 · TA获得超过912个赞
知道小有建树答主
回答量:695
采纳率:0%
帮助的人:643万
展开全部
1 费劲是为了结构化考虑,毕竟NVIC_Type里面有很多参数,不止一个不是?
如果都裸露出来,万一有一天要面对多个对象怎么办?
这样还有一个好处就是,只要知道结构体的名字就可以顺藤摸瓜找参数

2 (NVIC_Type *)是指定NVIC的类型,也就是NVIC在用的时候会被当作这个类型处理。
NVIC的值是NVIC_BASE = SCS_BASE + 0x0100

我们知道结构体变量的实质是一个指向其内存空间头部的指针,与结构体中的首元素内存地址相等,那ISER既然是首元素,他的地址自然是与NVIC一样啦,也就是:
SCS_BASE + 0x0100 = 0xe000e100
本回答被提问者采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
大别山的蜗牛
高粉答主

2016-01-19 · 一只互联网搬运的蜗牛
大别山的蜗牛
采纳数:6928 获赞数:12024

向TA提问 私信TA
展开全部
IExample *
声明一个指向IExample类型的指针
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
jeason_temp
2011-12-21
知道答主
回答量:15
采纳率:0%
帮助的人:11.7万
展开全部
1、(NVIC_Type *) 应该是类型强制转换的意思,
把从NVIC_BASE这个地址开始的连续数据,转换成NVIC_Type的类型
2、使用 #define ISER (0xE000E100) 的原因:应该是 ISER 这个数据的值是不能改变的。
也就是C++中const的性质。
如果使用 ISER=0x85c0; 万一后面又有其他代码修改了 ISER 的值,编译器不会报错。
所以,使用#define 相当于降低了系统出错的风险。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(6)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式