函数、指针、数组(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;
}	

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

函数返回值类型 (*数组名[指向函数的指针个数])(函数形参)

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};
}

猜你喜欢

转载自blog.csdn.net/qq_40862304/article/details/98631183