函数、指针、数组混搭结果:指针数组 数组指针 指针函数 函数指针 函数指针数组[侧重点在混搭后面]
指针数组:数组里面放指针的数组(存储指针的数组)
指针指向的数据类型 *数组名[指针个数] = {地址值}
char ch_1[] = "今天星期三";
char ch_2[] = "Good!";
char ch_3[] = "你们是编程小王子";
char *ch[3] = {ch_1,ch_2,ch_3};
或者
char *ch[3] = {"今天星期三","Good!","你们是编程小王子"};
数组指针:指向数组的指针
指针指向的数据类型 (*指针名)[数组小数组个数] = {地址值}
char test[3][5] = {"hehe","aae","abc"};
char (*p)[5]; //[5]与二维数组当中的[5]要一致
p = test; //相关联 p+1 == test+1
for (i = 0; i < 3; i++)
{
//printf("p[%d]=%s\n",i,p[i]);
printf("p[%d]=%s\n",i,*(p+i));
}
思考:使用p将数组test中的字符串打印出来
函数指针:指向函数的指针
函数返回值类型 (*指针名)(函数形参)
函数名就是一个地址
int add(int x,int y)
{
int sum;
sum = x+y;
return sum;
}
int (*p)(int x,int y)
p = add; //指针相关联 p = &add;
um = p(i,j);
指针函数:返回指针的函数
函数返回值类型 *函数名(函数形参)
int *add(int x,int y)
{
int *p;
int sum;
p = ∑
*p = x+y;
return p;
}
int main(void)
{
int i,j,*num;
printf("请输入两个正整数:\n");
scanf("%d%d",&i,&j);
num = add(i,j);
printf("num = %d\n",*num);
return 0;
}
缺陷:add函数使用完内部变量已经全部不存在,*num属于内存非法访问
解决方法:
int *add(int x,int y)
{
int *p;
p = (int *)malloc(sizeof(int)); //在堆空间开辟4字节的空间,程序退出开辟空间仍然存在
*p = x+y;
return p;
}
int main(void)
{
int i,j,*num;
printf("请输入两个正整数:\n");
scanf("%d%d",&i,&j);
num = add(i,j);
printf("num = %d\n",*num);
free(num); //释放堆空间地址
return 0;
}
函数指针数组:存储函数指针的数组(数组存储指针,指针指向函数)
函数返回值类型 (*数组名[指向函数的指针个数])(函数形参)
int (*a[10])(int x,int y)
int add(int x,int y)
{
...
}
int sub(int x,int y)
{
...
}
int cmp(int x,int y)
{
...
}
int main(void)
{
int (*a[3])(int x,int y) = {add,sub,cmp};
}