ARM C语言笔记

1、unsigned long == unsigned long int ,2者是等价的,均是无符号整形变量,在ARM9中占4个字节,int可省略不写

 

2、const是一个C语言的关键字,它限定一个变量不允许被改变。

 

3、局部变量,可与全局变量重名,但其会屏蔽全局变量,在函数内引用这个变量时,会用到同名的局部变量,而不会用到全局变量,一个文件可声明多个局部变量,互不影响

 

4、volatile关键字用法:

volatile是一个类型修饰符(type specifier),一个定义为volatile的变量是说这变量可能会被意想不到地改变,这样,编译器就不会去假设这个变量的值了。精确地说就是,优化器在用到这个变量时必须每次都小心地重新读取这个变量的值,而不是使用保存在寄存器里的备份。

 

5、32位ARM中 unsigned int占4个字节

      short unsigned int占2个字节

        

6、unsigned char最大只有255(0~255)

 

7、unsigned long占4个字节

 

8、break不止用于switch,还可以用来跳出循环体,结束循环体

 

9、#define SP ((volatile unsigned int *) 0x20000000

     SP[0x80]=0;

    具体意义:首先宏定义了一个unsigned int型指针(指向的地址可存储4个字节),该指针指向0x20000000的内存地址,

           且SP的指向的地址是volatile型,即可变的

           然后,SP[0X80]=0;是指向偏移地址0x80处,即内存地址0x20000080处

     *****另外要注意理解“指针+1”的含义:其结果与指针自身的类型有关,如果指针是unsigned char,则结果会在原来地址的基础上加一个字节,

     *****如果指针类型是unsigned int,则在原来地址的基础上加4个字节!

     *****指针加1不是意味着指针值加1,而是意味着指针指向下一个内存单元。该内存单元所占的字节数与你定义的指针类型有关!

 

10、结构体使用小结:

(1)struct在代码中常见两种形式:

struct A

{

//...

};

 

struct

{

//...

} A;

这其实是两个完全不同的用法:

前者叫做“结构体类型定义”,意思是:定义{}中的结构为一个名称是“A”的结构体。

这种用法在typedef中一般是:

typedef struct tagA //故意给一个不同的名字,作为结构体的实名

{

//...

} A; //结构体的别名。

后者是结构体变量定义,意思是:以{}中的结构定义一个名称为"A"的变量。这里的结构体称为匿名结构体,是无法被直接引用的。

也可以通过typedef为匿名结构体创建一个别名,从而使得它可以被引用:

typedef struct

{

//...

} A; //定义匿名结构体的别名为A

另外注意: 在C中,struct不能包含函数。在C++中,对struct进行了扩展,可以包含函数。

(2)结构体指针:

首先让我们定义结构体:

struct stu

{

char name[20];

long number;

float score[4];

} ;

再定义指向结构体类型变量的指针变量:

struct stu *p1, *p2 ;

定义指针变量p1、p2,分别指向结构体类型变量。引用形式为:指针变量→成员;

 

11、定义全局静态变量的好处:

  <1>不会被其他文件所访问,修改。

  <2>其他文件中可以使用相同名字的变量,不会发生冲突。

 

12、函数指针和指针函数

【函数指针】

指向函数代码首地址的指针变量称为函数指针。

(1).函数指针定义

函数类型(*指针变量名)(形参列表);

在定义函数指针时请注意:

函数指针和它指向的函数的参数个数和类型都应该是—致的;

函数指针的类型和函数的返回值类型也必须是一致的。

(2).函数指针的赋值

函数名和数组名一样代表了函数代码的首地址,因此在赋值时,直接将函数指针指向函数名就行了。

例如,

int func(int x);   /* 声明一个函数 */

int (*f) (int x);    /* 声明一个函数指针 */

f=func;            /* 将func函数的首地址赋给指针f */

赋值时函数func不带括号,也不带参数,由于func代表函数的首地址,因此经过赋值以后,指针f就指向函数func(x)的代码的首地址。

(3).通过函数指针调用函数

函数指针是通过函数名及有关参数进行调用的。

与其他指针变量相类似,如果指针变量pi是指向某整型变量i的指针,则*p等于它所指的变量i;如果pf是指向某浮点型变量f的指针,则*pf就等价于它所指的变量f。同样地,*f是指向函数func(x)的指针,则*f就代表它所指向的函数func。所以在执行了f=func;之后,(*f)和func代表同一函数(即该函数的首地址)。

由于函数指针指向存储区中的某个函数,因此可以通过函数指针调用相应的函数。现在我们就讨论如何用函数指针调用函数,它应执行下面三步:

首先,要说明函数指针变量。

例如:int (*f)(int x);

其次,要对函数指针变量赋值。

例如: f=func;    (func(x)必须先要有定义)

最后,要用 (*指针变量)(参数表);调用函数。

例如:    (*f)(x);(x必须先赋值)

【指针函数】

可以返回指针的函数即指针函数

一个函数不仅可以带回一个整型数据的值,字符类型值和实型类型的值,还可以带回指针类型的数据,使其指向某个地址单元。

        返回指针的函数,一般定义格式为:

        类型标识符    *函数名(参数表)

int *f(x,y);

其中x,y是形式参数,f是函数名,调用后返回一个指向整型数据的地址指针。f(x,y)是函数,其值是指针。

如:char *ch();表示的就是一个返回字符型指针的函数

注意:

int (*f)(int x);    /* 声明一个函数指针 */

int *f(int x);      /* 声明一个指针函数 */

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值