一些温习的内容

来源:互联网 发布:php如何做面包屑 编辑:程序博客网 时间:2024/05/21 02:19

温习一下,不搞错了


一个整型数:int a;

一个指向整型数的指针: int  *a;

一个指向指针的指针,它指向的指针是指向一个整型数: int  **a;

一个有10个整型数的数组:int a[10];

一个有10个指针的数组,该指针指向一个整型数, int *a[10];

一个指向10个整型数数组的指针 int *(a[10]);  int  (*a)[10];

一个指向函数的指针,该函数有一个整型参数,并返回一个整型数;int  (*a)(int b)

一个有10个指针的数组,该指针指向一个函数,该函数有一个整型参数并返回一个整型数:int (*a[10])(int b)


没有括号 int *a[10]; :以*为分界:首先看右边,我们确定它是一个数组,再看左边,它的数组内容是一个指针,并且指针指向整型数


有括号int (*a)[10]:先把括号中有指针的删掉,由删掉的内容确定是一个指针,再通过删掉之后剩下的内容,我们确定这个指针指向了一个有10个整型数的数组

最原始的就是:先把类型去掉,再分析括号优先级最高,从左到右分析;




关于static的作用:

1>在函数体,一个被声明为静态的变量,在这一函数被调用过程中维持其值不变;

2>在模块内(但在函数体外),一个被声明为静态的变量 可以被模块内所有函数访问,但不能被模块外的其他函数访问,它是一个本地的全局变量;

3>在模块内,一个被声明为静态的函数只可被这一模块内的其它函数调用,那就是,这个函数被限制在声明它的模块的本地范围内使用


全局变量与全局静态变量区别

静态全局变量好处:

1,在某源文件中定义的静态全局变量不能被其它源文件使用或修改;

2,其他文件中可以定义相同变量名,不会发生冲突; 

3,只能在本文件中使用,具有内部链接的静态,不得在其它文件里调用;


局部变量与静态局部变量:局部变量是保存在栈中,而静态局部变量保存在全局数据区;



静态函数的好处:静态函数不能被其他文件引用,其他文件中定义有相同的函数名,也不会引起冲突;


而extern的作用刚好相反,一个函数或者变量使用extern声明,表示该变量或者函数要去其他的文件里面去寻找其定义;



关于const变量

1,只读变量,

const int a;  //一个常整型数

int const a;//一个常整型数

int * const a;// a是一个指向常整型数的指针(常整型数是不能修改的,但是指针可以)

int const *a const;// a是一个指向常整型数的常指针

const的好处就是,你下次再读这段代码时,你一眼就能发现 这是一个常量,是不能修改的,只读的;



关于volatile

一个定义为volatile的变量,其意思就是说对于一些共享的变量可能会随时被其他的线程改变;

在每次读取这个变量时,就不能读取寄存器里面的值,

比如:并行设备中的硬件寄存器;一个中断服务子程序中会访问到的非自动变量;多线程应用中被几个任务共享的变量;



一个参数即可以是const也可以是volatile吗 ? 当然,就比如只读的状态寄存器,它是volatile因为可能被意想不到的改变,它是const因为程序不应该试图去修改它

一个指针可以是volatile吗? 可以,比如,函数指针,我如果要执行函数A,可能执行函数B时,我要将这个函数指针指向C;

看一个函数:

int square (volatile int *ptr)  //注意 指向*ptr指针是指向一个随时可变的int;

{

    return *ptr * *ptr;//返回*ptr指向值的平方,但是由于*ptr指向一个volatile型参数,

  return a*b;

}

在读*ptr时,可能随时会变;



int a,b;

a = *ptr;//  *ptr随时可变;

  b= *ptr; // *ptr随时可变,可能现在读这个*ptr指向


设置bit3,清除bit3,

#define BIT3 (0X1<<3)

static int a;   //访问固定的内存位置

void set_bit3(void)

{

a |= BIT3;


}


void Reset_bit3(void)

{

a & = ~ BIT3;

}


a=a | 0x00000004

a = a & 0xfffffffb


如何去访问特定的内存位置;

设置绝对地址0x67a9的整型变量的值为0xaa66;


int *ptr;

ptr=(int *)0x67a9;

*ptr = 0xaa66;



看如下的函数

__interrupt double compute_area(double radius)

{

double area = PI * radius * radius;

printf("\n Area = %f",area);

return area;


}

错误一:中断函数是不允许有返回值,

错误二:中断函数不允许传递参数;

有些处理器或编译器 是不允许在中断里面做浮点运算的,因为浮点运算量很大,比较消耗时间;



再看一个函数:

void foo(void)

{

unsigned int a =6;

int b = -20;

(a+b > 6)?puts(">6"):puts("<=6");

}

输出是 >6 ;

在表达式中存在有符号类型和无符号类型时,有符号类型自动转换为无符号类型,因此-20 变成了一个非常大的整数,故输出 >6



关于typedef 

看代码:#define dPS struct s *

typedef struct s * tPS;


dPS p1,p2;

tPS p3,p4;

第一个扩展为:struct s * p1,p2;

第二个扩展为: struct s * p3, struct s * p4;


看一个例子;

int a=5,b=7,c;

c = a +++ b;

问:a,b,c 分别为多少?

答:a =6,b=7,c=12;认真想一下优先级,说不准就错了哈;






0 0
原创粉丝点击