本文主要对本专题的学习重点以习题的方式进行了总结。
#define 宏名(大写) 宏体
#define SECOND_OF_YEAR (365*24*3600)UL//常量表达式编译的时候已经计算过了;
//()用于保护,防止优先级导致的错误;默认是int,UL是无符号long类型
a)一个整型数(An integer)
int a;
b)一个指向整型数的指针( A pointer to an integer)
int *a;
c)一个指向指针的的指针,它指向的指针是指向一个整型数( A pointer to a pointer toan integer)
int **a;
d)一个有10个整型数的数组(An array of 10 integers)
int a[10];
e)一个有10个指针的数组,该指针是指向一个整型数的。(An array of 10 pointers tointegers )
int *a[10];//int是修饰*的,读取大小;*是修饰10的,修饰10个的每一个;[]才是修饰a的,a是数组
f)一个指向有10个整型数数组的指针(A pointer to an array of 10 integers)
int [10] *a;//分析过程
//---->
int (*a)[10];//最终写法,(*a)右面是[10],说明是按照数组(10个整体,连续内存块)的方式来读的
g)一个指向函数的指针,该函数有一个整型参数并返回一个整型数( A pointer to afunction that takes an integer as an argument and returns an integer)
int fun(int x) *a;//分析过程
//---->
int (*a) (int x);//最终写法,(*a)右面是(int x),说明是按照函数(连续内存块)的方式来读的
h)一个有10个指针的数组,该指针指向一个函数,该函数有一个整型参数并返回一个整型数(An array of ten pointers to functions that take an integer argument and return aninteger )
int fun(int x)[10] *a;//分析过程
//---->
int (*a[10]) (int x);//最终写法;先看是什么,再看指向什么(有什么),最后看读的方式(或者参数与返回)
类型修饰符:对内存资源存放位置的限定,资源属性中位置的限定。
a)关键字static的作用是什么?
//1修饰局部变量
//默认局部变量在栈空间存在,生存周期比较短。
//局部静态化后,局部变量在静态数据段保存,生存周期非常长。
//===================================================
//2.修饰全局变量
//编译时防止重命名,只在本文件中起作用。
//===================================================
//3.修饰(全局)函数
//编译时防止重命名,只在本文件中起作用。
b)关键字const有什么含意?
//在C语言中,是建议性的只读,不具备强制性,!=常量。
//使用指针、越界、溢出的方式是可以修改的。
//==================================================
//在C++中是常量
c)关键字volatile有什么含意?并给出三个不同的例子。
//防止C语言编译器的优化,它修饰的变量可能通过第三方来修改,比如硬件、中断及多线程。
嵌入式系统总是要用户对变里或寄存器进行位操作。
a|=(0x1<<3);//bit3代表第四位,或
//=============
a&=~(0x1<<a);//与
int *p=(int *)0x67a9;//强制转换为地址属性
p[0]=0xaa66;
//or
*((int *)0x67a9)=0xaa66;
//问题变化:把这个地址当成函数来处理,分析如下:
(*)0x67a9;//(*)强转为地址
void(*)(void)0x67a9;//函数带输入参数和返回值,整体是一个地址
(void(*)(void)0x67a9)();//后加()调用
参考资料:
链接1: 嵌入式C语言
链接2: 嵌入式工程师C语言面试常见的0x10个问题