C的指针和数组
int i; //定义整型变量i
int *p; //定义一个指向int的指针变量p
int a[5]; //定义一个int数组a
int *p[5]; //定义一个指针数组,其中每个数组元素指向一个int型变量的地址
int (*p)[5]; //定义一个指向int[5]类型的指针变量
int func(); //定义一个函数func,返回类型为int
int *func(); //定义一个函数,返回类型为int*
int (*p)(); //定义一个指向函数的指针,返回类型为int
int **p; //定义一个指向int的指针的指针,二级指针
a[1]+2 = *(a+1)+2 = &a[1][2] //第一行第二列元素地址
*(a[1]+2) = *(*(a+1)+2) = a[1][2] // 第一行第二列元素的值
多级指针
int a;
int *p = &a; //指向整型变量a的指针,通过*p访问a
int **pp = &p; //指向int型指针p的指针,通过**pp访问a,通过*pp访问p
int ***ppp = &pp; //指向int **pp的指针,通过***ppp访问a
函数作为参数
1.不用typedef
int *func1(int n) ///定义一个函数,返回类型为int* { printf("%d",n); } int *func2(int *(*p)(int ),int n) { return p(n); } int main { int a = 1; int *p = func2(func1,a); return 0; }
2.使用typedef
int *func1(int n) ///定义一个函数,返回类型为int* { printf("%d",n); } typedef int *(*P_INT)(int); //定义P_INT是指向int *函数形参为int的函数的指针 ,即为指向func1函数的指针 int *func2(P_INT p,int n) { return p(n); } int main { int a = 1; int *p = func2(func1,a); return 0; }
进阶:定义一个函数的数组
int *func1(int n) ///定义一个函数,返回类型为int* { printf("%d",n); } typedef int *(*P_INT)(int); //定义P_INT是指向int *函数形参为int的函数的指针 ,即为指向func1函数的指针 int *func2(P_INT p,int n) { return p(n); } int main { int a = 1; int *p = func2(func1,a); P_INT arr[5];//原始定义 int *(*p[5])(int); //这是一个数组,一共5个成员,每个成员都是指向int *函数形参为int的函数的指针 return 0; }
typedef进阶:
上面的代码中int *func1(int n)作为一个函数的返回值
P_INT func3()
{
return func1;
}