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.数组元素的指针

2.引用数组元素指针的运算

3.通过指针引用数组元素

4.用数组名作函数参数

归纳:如果有一个实参数组,要想在函数中改变此数组元素中的元素的值,实参与形参有四种可能:

?5.通过指针引用多维数组

1)多维数组元素的地址

2)指向多维数组元素的指针变量



前言

指针变量本质上是变量,首先就是要定义指针变量,基本格式为:?类姓名 *?指针变量名(例如:int *p),定义指针变量的同时,要对指针变量进行赋值,否则,这个指针就有可能指向隔壁老王家的门,从而会犯错误(Error!)

关于指针变量(指针指向变量)在指针部分属于比较简单内容,可自行学习。以下是在指针变量的基础上,研究通过指针指向数组的问题。

1.数组元素的指针

int a[5] = { 1,5,8,9,10 };
int* p;//定义了一个指针
p = &a[0];//其实是给p进行了赋值,让他指向a[0]的地址,不让他指向隔壁老王家

//p的初始地址也可以表示成:
int* p;
p = a;
//也可以合并成一行

2.引用数组元素指针的运算

//地址的运算
p + 1;//指向同一数组的下一个元素的地址
p - 1;
p++; ++p;
p--; --p;

//表示以上地址里边的值,加个*就行了
//*号只有在定义的时候,代表把这个变量p定义成指针变量
//除此之外,*号就表示这个地址里边的值【在一维数组可以这样理解】

int a[5] = { 1,5,8,9,10 };
int* p;//定义了一个指针
p = &a[0];
*(p + 1);//p指向a[0]的地址,p+1指向a[1]的地址。那么*(p + 1)就是a[1]的值
int a[5] = { 1,5,8,9,10 };
int* p;//定义了一个指针
p = &a[0];
*(p++);//p++的运算结果是p,所以代表*(p++)对应的是a[0]的值,同时p变成了指向a[1]的地址

3.通过指针引用数组元素

不用指针:a[i];

用指针变量p:*(p+i);或者*(a+i);

4.用数组名作函数参数

数组名作为函数实参,传递到调用函数时,实际上传的是数组的首地址,那么没学指针以前,我们形参也用了一个数组接收,但是接收首地址,其实用指针比较方便,因此我们在形参的时候定义了一个指针变量用来接收数组的首地址,那么在调用函数的时候,对形参指针p的改变,也就实现了对数组的改变。

这个时候就不需要再对形参指针定义了,因为已经传过来了形参的首地址,实参和形参之间已经完成了定义,就不会指向隔壁老王家了。

归纳:如果有一个实参数组,要想在函数中改变此数组元素中的元素的值,实参与形参有四种可能:

?形参和实参都用数组名;实参用数组名,形参用指针;

实参形参都用指针变量;实参为指针变量,形参用数组名;

?5.通过指针引用多维数组

1-4是利用指针引用多维数组,以下开始用指针变量指向多维数组中的元素。

1)多维数组元素的地址

?//定义一个二维数组a[i][j]
a:首行地址;? ? ?a[i]:i行0列元素地址;? ? ?a+i:i行的首地址

&a[i]:i行首地址? 相对于扩大了范围;

*(a+i):i行0列元素地址

//按照刚才的定义在地址的基础上再加一个*就表示这个地址对应的元素的值。例如*((a+i)+j)表示i行j列元素的地址;*(*((a+i)+j))就表示i行j列元素的值。

2)指向多维数组元素的指针变量

(1)指向数组元素的指针变量

p=a[0];//0行0列的元素地址

p+(i*m+j)//指向i行j列的元素的地址,前边再加上*表示具体的值

?(2)指向由m个元素组成的一维数组的指针变量

int(*p)[4]//数据类型是int (*)[4]型

p=a//初始化赋值,这里要求赋值,p的初始值应该是,二维数组首行的地址 ,所以是a,也可用&a[0];

3)用指向数组的指针作函数参数

前面我们形参用指针去接收实参传来的地址,当然,如果说是一个二维数组,实参传的是首行的地址,这时候形参就要用int(*p)[]去接收这一行的地址。

实例:班级内3名同学,四门工科,组成了一个二维数组,计算二维数组的平均数,也就是所有科目的平均成绩(尽管没有实际意义,但是是为了说明形参指针接收单个元素的地址),第二个问题就是要输出第i个学生的四门成绩(这里很明显就要用到行地址指针来接收。)

#include<stdio.h>

int main()
{
	void average(double* q, int num);
	void search(double(*q)[4], int n);

	double* p;
	double(*p1)[4];
	double score[][4] = { {65,67,90,60},{58,98,56,99},{96,89,87,99} };
	p = score[0];//初始化定义的是0行0列的元素的地址
	p1 = score;//初始化定义的是0行元素的地址
	average(p,12 );//传的实参是p,也就是score[0][0]的地址
	search(p1, 3);//传的p1,是0行的首地址
	return 0;
}

void average(double* q, int num)//形参用指向变量的指针变量
{
	double sum = 0,aver = 0;
	double* q_end;
	q_end = q + 11;

	for (; q <=q_end; q++)
	{
		sum += *q;
	}
	aver = sum / num;
	printf("平均分为:%.3f", aver);
}

void search(double(*q1)[4], int n)//形参用指向一维数组的指针变量
{
	int i;
	printf("请输入你想查询的同学序号:");
	scanf("%d", &i);
	for (int j = 0; j < 4; j++)
	{
		printf("%5.1f", *(*(q1 + i - 1) + j));
	}
}

欢迎交流!下一篇是“通过指针实现对字符串的引用”

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

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