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); /* 声明一个指针函数 */