一些温习的内容
来源:互联网 发布: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;认真想一下优先级,说不准就错了哈;
- 一些温习的内容
- 大三了,写博客来温习自己的学习内容
- java 基础(基本数据类型)的一些温习
- SQL的一些内容!
- docker的一些内容
- mongodb的一些内容
- XListView的一些内容
- static的一些内容
- 温习Activity的生命周期
- 冒泡排序的温习
- 温习Activty的生命周期
- 摸板的一些内容
- 字符编码的一些内容
- 获取时间的一些内容
- struts2的一些小内容
- 一些基础的 Javascript 内容
- 有关DPC的一些内容
- 数据字典的一些内容
- Spark Streaming+kafka+eclipse编程
- IOS工程自动打包并发布脚本实现
- SQLServer游标(Cursor)简介和使用说明
- iOS中属性与成员变量的区别
- C++ Primer Plus (第6版)编程练习 代码-----第十章
- 一些温习的内容
- 好博客-学习好资源
- [All in one WP Migration plugin] 搬迁wordpress 站点
- 数据分析与处理之二(Leveldb 实现原理)
- fragment、ListFragment使用ListView及自定义Listview等初始化操作
- 第十二周 项目4-点,圆的关系(1)
- VS单步调试的无法进入断点、行号错乱等问题解决方法
- Java获取内存使用信息
- 使用Valgrind找出Android中Native程序内存泄露问题