1.
int
*p1 =
new
int
[
10
];
int
*p2 =
new
int
[
10
]();
p1申请的空间里的值是随机值,p2申请的空间里的值已经初始化
2.指针函数,函数指针,指针数组,数组指针
根据后边的定义,例如指针函数是函数,函数指针是指针。
优先级顺序:()>[]>*
指针函数 | 本质是一个函数,而该函数的返回值是一个指针。 | 类型标识符* 函数名(参数表) int* fun(int x,int y); |
函数指针 | 本质是一个指针变量,该指针指向这个函数。 | 类型说明符 (*函数名) (参数) int (*fun)(int x,int y); |
指针数组 | 根据优先级,先看[],则p是一个数组,再结合*,这个数组的元素是指针类型,共n个元素,这是“指针的数组”,即指针数组。 | *p[n] |
数组指针 | 根据优先级,先看括号内,则p是一个指针,这个指针指向一个一维数组,数组长度为n,这是“数组的指针”,即数组指针; | (*p)[n] |
- 回调函数是一个通过函数指针调用的函数。
- 如果把函数的指针(地址)作为参数传递给另一个函数,当这个指针被用来调用其所指向的函数时,我们就说这是回调函数。
- 回调函数不是由该函数的实现方直接调用,而是在特定的事件或条件发生时由另外一方调用的,用于对该事件或条件进行相应。
3.typedef 多种用途
1.给已定义的变量类型重命名,比较常用的就是:
typedef unsigned char uint8_t
typedef unsigned char u8
typedef struct student
{
char name[10];
u8 age;
}student_t;
声明:student_t stu_1;
2.定义数组类型
typedef int arr_t[10];//定义数组类型,10个int的一维数组。
声明:arr_t a1, a2, a3;
3.定义数组指针类型
typedef int (*pArr_t)[10];//定义指针类型,该类型的指针指向10个int的一维数组。
声明:pArr_t p1, p2, p3;
4.定义函数指针类型
//定义函数指针类型,该指针指向返回值为void 形参为const char *uuid、char *data、int len。
typedef void (*pFun_t)(const char *uuid, char *data, int len);
声明:
void Func_A(const char *uuid, char *data, int len)
{
...
}
pFun_t Handler = Func_A;
4.宏的多种用途
1.参数替换
#define ARRAY_SIZE 10
2.函数替换
#define MAX(a,b) ((a)>(b)?(a):(b))
3.字符串拼接
#define CONCAT(str1,str2) str1 ## str2
4.条件编译
#ifdef #ifndef
#if #endif
5.多行代码
#define FUNC \
printf("Hello\r\n");\
printf("world !\r\n");
6.递归调用
#define FIB(n) ((n) <= 1 ? (n) : FIB(n-1) + FIB(n-2))
7.类型转换
#define INT_TO_U8(i) ((u8)(i))