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

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;为什么就要这么费劲?定义了那么多东西?它这么做有什么好处?

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;
温馨提示:答案为网友推荐,仅供参考
第1个回答  2015-10-31

在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;
}

第2个回答  推荐于2017-09-03
1 费劲是为了结构化考虑,毕竟NVIC_Type里面有很多参数,不止一个不是?
如果都裸露出来,万一有一天要面对多个对象怎么办?
这样还有一个好处就是,只要知道结构体的名字就可以顺藤摸瓜找参数

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

我们知道结构体变量的实质是一个指向其内存空间头部的指针,与结构体中的首元素内存地址相等,那ISER既然是首元素,他的地址自然是与NVIC一样啦,也就是:
SCS_BASE + 0x0100 = 0xe000e100本回答被提问者采纳
第3个回答  2016-01-19
IExample *
声明一个指向IExample类型的指针
第4个回答  2011-12-21
1、(NVIC_Type *) 应该是类型强制转换的意思,
把从NVIC_BASE这个地址开始的连续数据,转换成NVIC_Type的类型
2、使用 #define ISER (0xE000E100) 的原因:应该是 ISER 这个数据的值是不能改变的。
也就是C++中const的性质。
如果使用 ISER=0x85c0; 万一后面又有其他代码修改了 ISER 的值,编译器不会报错。
所以,使用#define 相当于降低了系统出错的风险。

相关了解……

你可能感兴趣的内容

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 非常风气网