函数、指针、数组(2)

小技巧:

函数、指针、数组混搭结果:指针数组 数组指针 指针函数 函数指针 函数指针数组[侧重点在混搭后面]


指针数组:数组里面放指针的数组(存储指针的数组)
指针指向的数据类型 *数组名[指针个数] = {地址值}

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 = &sum;
	*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;
	}	

函数指针数组:存储函数指针的数组(数组存储指针,指针指向函数)

<font color=red size=3 face="黑体">函数返回值类型 (*数组名[指向函数的指针个数])(函数形参)</font>
	
	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};
	}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

炒番茄蛋的厨子

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值