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++知识库 -> 【C语言】案例四十五 数据表 -> 正文阅读

[C++知识库]【C语言】案例四十五 数据表

案例描述
本案例主要讲解的主要知识有两个:一是函数指针,该知识将在选择求和函数时使用;二是指针与二维数组的联系。本案例中的存储基于二为数组,数据的获取利用数组指针,下面分别讲解这两个知识点:

必备知识
1,指针与二维数组
在之前的案例中,我们学习了如何用指针引用一维数组,二维数组与多维数组同样有地址,也可以使用指针引用,只是因为其逻辑结构较一维数组复杂,所以操作也比较复杂。这里我们来介绍指针和二维数组的关系。
假设要定义一个二行三列的二维数组,示例如下:

int a[2][3] = {{1,2,3}{4,5,6}};

其中 a 是二维数组的数组名,该数组中包含两行数据。二维数组的数组指针同样指向数组中的第一个元素的地址,只是二维数组中的元素不是单独的数据,而是由多个数据组成的一维数组。
假设数组中的数据类型为int,每行有n个元素,则数组指针每加一,指针实际移动的步长为n*sizeof(int)
另外:a[0],a[1]相当于二维数组中一维数组的数组名,指向二维数组对应行的第一个元素,a[0] = &a[0][0] ; a[1] = &a[1][0];

二维数组中相关指针与数据的表示形式

  1. 表示形式 含义
  2. a 二维数组名,指向一维数组a[0],也是a[0][0]的地址
  3. a[i],*(a + i) 一维数组名,表示二维数组第i行元素首地址,值为&a[i][0]
  4. *(a + 1)+j 二维数组元素地址,二维数组中最小数据单元地址,等价于&a[i][j]
  5. ((a+1)+j) 二维数组元素,表示第i行,第j列数据的值,等价于a[i][j]

2,作为函数参数的二维函数
一维数组的数组名就是一个指针,若要将一维数组传入函数,只需传入数组名,或指向该数组首地址的指针即可。假设要将一维数组a[5]传入func()函数中,函数声明如下:

func(int a[]);

函数调用时的形式如下

func(a);

若在程序中定义一个指向该一维数组的指针

int *p = a;

则也可以将该指针传入函数,其形式如下

func(p);

若使用一维数组指针传值得方式类比二维数组,很容易将其传入的参数声明为“int **arr”,但这样写是不对的,因为int **arr是一个二级指针,它声明的是一个指向整型指针的指针,而非指向整形数组的指针。
若将二维数组传入函数,形式相对略微复杂,一维数组可以不关心数组中数据的个数,但二维数组即有行,又有列,是在定义时行值可以缺省,列值不能缺省,所以将二维数组的指针传递到函数中时必须满足数组的列值,定义一个数组指针的形式如下:

数据类型(*数组指针名)[列号]

假设现在要将数组a[4][5]传入函数func(),则其现实如下:

int (*p)[5] = a;
func(p);

在这里要注意指针数组与数组指针的区别。指针数组表示数组元素都为指针的一个数组,其定义形式的区别在于*和[]与变量名结合的优先顺序,切记在定义数组指针时()不可丢失,因为[]的优先级高于**,所以如果没有小括号,该变量就会被编译为指针数组。

函数指针
1,函数指针的定义
若在程序中定义了一个函数,编译时,编译器会为函数代码分配一段存储空间,这段空间的起始地址成为这个函数的指针。
与普通变量相同,同样可以定义一个指针指向存放着函数代码的存储空间的地址,这样的指针叫函数指针。函数指针的定义格式如下:

返回值类型(*变量名)(参数列表)

其中返回值类型表示指针所指函数的返回值类型,参数列表表示该指针所指函数的形参列表
假设定义一个参数列表为两个int型变量,返回值类型为int的函数指针,则格式如下:

int(*p)(int,int);

需要注意的是,因为*的优先级高,所以将(*变量名)用小括号括起来
函数指针的类型应与函数返回值类型相同,假设有一函数声明为:

int func(int a,int b);

则可以使用以上定义的函数指针指向该函数,即使用该函数的地址为函数指针赋值,其形式如下:

p = func;

由此可以看出,函数名类似于数组名也是一个指针指向函数所在的存储空间的首地址

2,函数指针的应用
函数指针主要有两个用途,一是调用函数,使用函数指针调用对应函数,方法与使用函数名调用函数类似,只需将函数名替换为“*指针名”即可。假设要调用指针指向p的函数,其形式如下:

(*p)(3,5)

二是将函数地址作为函数参数传入其他函数,将函数的地址传入其他参数,就可以在被调用函数中使用实参函数。函数指针作为函数参数的实例如下:

void func(int(*p)(int,int),int b,int c);

案例实现
1,案例设计

  1. 创建一个二维数组,使用循环语句为其赋值
  2. 在循环结构中使用指针读取数组中的数据并输出
  3. 根据案例要求,在程序中使用两个函数分别实现不同方式的求和计算
  4. 同时在主函数中创建函数指针,当用户做出选择后,根据选择结果调用函数

2,完整代码

#include <stdio.h>
#include <stdlib.h>

//两个求和函数的声明
void sumbyrow(int (*arr)[4],int row,int *sum);
void sumbycol(int (*arr)[4],int col,int *sum);

int main()
{
	int datatable[5][4] = { 0 };  //定义数据表,初始化数据表
	int i,j;
	printf("录入数据中...");
	for(i = 0;i < 5;i++)
	{
		for(j = 0;j < 4;j++)
			datatable [i][j] = i * 4 + j;
	}
	printf("录入完毕\n");
	int(*p)[4] = datatable;       //定义数组指针,指向二维数组datatable
	printf("输出数据\n");
	for(i = 0;i < 5; i++)
	{
		for(j = 0;j < 4; j++)
			printf("\t%d",*(*(p + i) + j));
		printf("\n");
	}
	
	int select,pos,sum;   //定义求和方式,行/列,和
	void(*q)();
	//求和计算
	printf("请输入求和方式(行:0/列:1):");
	scanf("%d",&select);
	printf("选择行/列:");
	scanf("%d",&pos);
	if (select == 0)
	{
		printf("按行求和,第%d列数据",pos);
		sumbyrow(datatable ,pos,&sum);
	printf("求和结果为:%d\n",sum);
	}
	else if (select == 1)
	{
		printf("按行求和,第%d列数据",pos);
		sumbycol(datatable ,pos,&sum);
	printf("求和结果为:%d\n",sum);
	}
	
	system("pause");
	return 0;
}

//按行求和
void sumbyrow (int (*arr)[4],int row,int *sum)
{
	int i = 0;
	*sum = 0;
	for(i = 0;i < 4; i++)
		*sum += *(*(arr + row-1) + i);
}

//按列求和
void sumbycol (int (*arr)[4],int col,int *sum)
{
	int i = 0;
	*sum = 0;
	for(i = 0;i < 5; i++)
		*sum += *(*(arr + i) + col-1);
}

运行结果
在这里插入图片描述

  C++知识库 最新文章
【C++】友元、嵌套类、异常、RTTI、类型转换
通讯录的思路与实现(C语言)
C++PrimerPlus 第七章 函数-C++的编程模块(
Problem C: 算法9-9~9-12:平衡二叉树的基本
MSVC C++ UTF-8编程
C++进阶 多态原理
简单string类c++实现
我的年度总结
【C语言】以深厚地基筑伟岸高楼-基础篇(六
c语言常见错误合集
上一篇文章      下一篇文章      查看所有文章
加:2021-08-25 12:01:58  更:2021-08-25 12:02:11 
 
开发: 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年12日历 -2024/12/27 6:16:13-

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