IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> C++知识库 -> BSP学习 Day17 C语言 指针变量做函数形参 指针函数 函数指针 -> 正文阅读

[C++知识库]BSP学习 Day17 C语言 指针变量做函数形参 指针函数 函数指针

目录

1.指针变量做函数形参

2. 指针函数

3.函数指针


1.指针变量做函数形参

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

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

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

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

以下代码是用函数求一个数组的平均值

#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);
}
  • 指针变量做二维数组的形参

数据类型 ? ? ? 函数名 ? ?二维数组指针 ? ?行数 ? ? ? ?列数
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;
	p =function();
	printf("p=%s",p);
	
	return 0;
}

char *function()
{
	char str [100]="hello world";
	return str;//局部变量的地址不能返回 
}

3.函数指针

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

格式:

返回值类型 (*函数指针变量名)(形参列表)

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

以下代码是做加减乘除取余的函数,然后用函数指针去调用函数

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

  C++知识库 最新文章
【C++】友元、嵌套类、异常、RTTI、类型转换
通讯录的思路与实现(C语言)
C++PrimerPlus 第七章 函数-C++的编程模块(
Problem C: 算法9-9~9-12:平衡二叉树的基本
MSVC C++ UTF-8编程
C++进阶 多态原理
简单string类c++实现
我的年度总结
【C语言】以深厚地基筑伟岸高楼-基础篇(六
c语言常见错误合集
上一篇文章      下一篇文章      查看所有文章
加:2022-09-04 00:51:43  更:2022-09-04 00:54:38 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年5日历 -2024/5/19 7:31:00-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码