原文地址http://www.freecls.com/a/2712/24
先了解下优先级,[]和()的优先级相同,他们比*的优先级高,结合是从左往右。
int * days[5]
days是数组,包含5个元素(int型指针)
int (* days)[5]
days是指针,指向一个数组,数组里有5个int元素
int days[2][3]
days是二维数组,包含2个数组,每个数组里有3个int元素
int *days[2][3]
days是二维数组,包含2个数组,每个数组里有3个int型指针
int (* days)[2][3]
days是指针,指向一个二维数组,包含2个数组,每个数组里有3个int元素
函数
char * temp(int)
temp是一个函数,参数为int元素,返回字符指针
char (* temp)(int)
temp是一个指针,指向一个函数,该函数接收一个int元素,返回字符
char (* temp[3])(int)
temp是一个数组,包含3个指针,每个指针指向一个函数,该函数接收一个int元素,返回字符
typedef及函数指针
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
char tmp(int num);
typedef unsigned char byte;
typedef struct person{
char name[10];
int age;
} P;
typedef char (* func)(int);
char call_tmp(func f, int a);
typedef int arr5[5];
typedef arr5 * p_arr5;
typedef p_arr5 arrp2[2];
void main()
{
//unsigned char c1 = 'a';
byte c1 = 'a';
//struct person p1 = {"freecls", 22};
P p1 = {"freecls", 22};
//int arr[5] = {1,2,3,4,5};
arr5 arr = {1,2,3,4,5};
//int (* p_arr)[5] = &arr;
p_arr5 p_arr = &arr;
//ap1是一个数组,包含2个指针,每个指针指向包含4个int元素的数组
//p_arr5 * ap[2];
arrp2 ap;
//声明一个函数指针
func fa = tmp;
//由于历史的原因,为了保持兼容,下面2种方式等价
char c = fa(109);
printf("%c\n", c); //m
c = (*fa)(109);
printf("%c\n", c); //m
//函数指针可以当做参数传递
c = call_tmp(fa, 110);
printf("%c\n", c); //n
}
char tmp(int num){
return num;
}
char call_tmp(func f, int a){
return f(a);
}
总结
1.本文只是对复杂的声明,typedef及函数指针做简单的介绍,如果有疑问可以给我留言
2.lua的版本为5.1,运行环境centos7 64位
3.原文地址http://www.freecls.com/a/2712/24