Day17 指针变量做函数形参 指针函数 函数指针

1. 指针变量做函数形参

1.1指针变量做一维数组形参

首先先了解如何定义一个一维数组指针

int arr[5] = {1, 2, 3, 4, 5};//定义一个一维数组
int *parr = arr;//指针指向数组的首地址

方式是在定义函数的时候,入参定义一个指针和数组长度

int function(int *p, int length);

当我们调用这个函数的时候,在入参时第一个参数传递一个地址(数组名即数组的首地址),即可对数组操作

现在可以用函数求一个数组的平均值

#include<stdio.h>

void ave_arr(int *p, int length);

int main()
{
    int arr[5] = {1, 2, 3, 4, 5};

    ave_arr(arr, 5);//数组名即首地址
    return 0;
}

void ave_arr(int *p, int length)
{
    float sum = 0;
    for(int i = 0; i < length; i++)
    {
        sum += p[i];
    }
    printf("数组的平均数是:%f\n", sum / length);
}

函数调用的时候将数组首地址传到函数,用地址对数组进行想要的求和操作,最后输出平均值

1.2 指针变量做二维数组的形参

首先先了解指针指向二维数组的定义:

int arr[3][5] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15};//定义一个二维数组
int (*parr)[5];//定义一个二维数组指针
parr = arr;//将二维数组指针指向二维数组的首地址

 定义函数时,也可以用二维数组指针定义形参

数据类型       函数名    二维数组指针    行数        列数
int         function(int (*parr)[5], int row, int column)

注意:二维数组后面的[]里是列数,不能省略

那现在做一个练习,利用函数的数组指针,将二维数组赋值、输出、求平均值、求每行的总数、求每列的总数

#include<stdio.h>

void print_arr(int (*parr)[5], int row, int column);//输出函数
void scanf_arr(int (*parr)[5], int row, int column);//赋值函数
void ave_arr(int (*parr)[5], int row, int column);//求平均函数
void sum_row(int (*parr)[5], int row, int column);//每行总和函数
void sum_column(int (*parr)[5], int row, int column);//每列综合函数

int main()
{
	int arr[3][5] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15};
	int (*parr)[5] = arr;
	print_arr(parr, 3, 5);
//	scanf_arr(parr, 3, 5);
//	print_arr(parr, 3, 5);
//	ave_arr(parr, 3, 5);
//	sum_row(parr, 3, 5);
	sum_column(parr, 3, 5);
	
	return 0;
}

void print_arr(int (*parr)[5], int row, int column)
{
	for(int i = 0; i < row; i++)
	{
		for(int j = 0; j < column; j++)
		{
			printf("%d\t", parr[i][j]);
		}
		printf("\n"); 
	}
}

void scanf_arr(int (*parr)[5], int row, int column)
{
	for(int i = 0; i < row; i++)
	{
		for(int j = 0; j < column; j++)
		{
			scanf("%d", &parr[i][j]);
		}
	}
}

void ave_arr(int (*parr)[5], int row, int column)
{
	int sum = 0;
	for(int i = 0; i < row; i++)
	{
		for(int j = 0; j < column; j++)
		{
			sum += parr[i][j];
		}
	}
	printf("数组的平均值是:%d\n", sum / (row * column));
}

void sum_row(int (*parr)[5], int row, int column)
{
	int sum = 0;
	for(int i = 0; i < row; i++)
	{
		
		for(int j = 0; j < column; j++)
		{
			sum += parr[i][j];	
		}
		printf("第%d行的总和为%d\n", i + 1, sum);
		sum = 0;	
	}	
}

void sum_column(int (*parr)[5], int row, int column)
{
	int sum = 0;
	for(int i = 0; i < column; i++)
	{
		
		for(int j = 0; j < row; j++)
		{
			sum += parr[j][i];	
		}
	printf("第%d列的总和为%d\n", i + 1, sum);
	sum = 0;	
	}	
		
} 

2. 指针函数

指针函数的本质是一个函数,只是他的返回值是一个指针

定义:

类型    *函数名    (形参列表)
int    *function()
{
    ...
    return p;//p是一个指针
}

由于局部变量的地址不能返回,那么我们就设置一个全局变量来定义一个指针函数将它的地址返回

#include<stdio.h> 
//1.局部变量的地址不能返回
//2.指针函数:他的返回值是一个指针 

char str[100] = "hello world";//全局变量

char *function(); //指针函数的声明

int main()
{
	char *p = function();//指针函数的调用,用一个指针来接返回值
	printf("%s", p);
	
	return 0;
}

char *function()
{
//	char str[100] = "hello world";//局部变量的地址不能返回,如果在这里定义的变量,是没有返回值的
	return str;//返回一个指针
}

3. 函数指针

本质是一个指针,它指向一个函数

注:函数的名字就是函数的首地址,即函数的入口地址,我们可以定义一个指针变量来存放函数的地址

定义:

int max(int a, int b)
{
    return a > b ? a : b;
}

int min(int a, int b)
{
    return a < b ? a : b;
}

int main()
{
    int a = 10;
    int b = 20;
    int (*p)(int, int)//定义一个函数指针,后面两个参数必须和调用函数严格匹配
    p = max;//  p指向max函数
    p(a, b);    //调用max函数
    p = min;//  p指向min函数
    p(a, b);//    调用min函数
    
}

现在可以做加减乘除取余的函数,然后用函数指针去调用函数

#include<stdio.h>

int add(int a, int b);//加函数
int sub(int a, int b);//减函数
int div(int a, int b);//除函数
int mul(int a, int b);//乘函数
int remaind(int a, int b);//取余函数

int main()
{
	int a = 10;
	int b = 20;
	int (*p)(int , int );//定义一个函数指针 
	p = div;//让函数指针指向除函数的首地址
	
	printf("%d\n", p(a, b));//调用此函数
	
	p = mul;
	printf("%d\n", p(a, b));//...
	
	p = sub;
	printf("%d\n", p(a, b));//...
	
	p = remaind;
	printf("%d\n", p(a, b));//...
	
	p = add;
	printf("%d\n", p(a, b));//...

	 
	return 0;
}

int add(int a, int b)
{
	return a + b;
}

int sub(int a, int b)
{
	return a - b;
}

int mul(int a, int b)
{
	return a * b;
}

int div(int a, int b)
{
	return a / b;
}

int remaind(int a, int b)
{
	return a % b;
}

  • 8
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值