当前位置: 首页 > article >正文

C语言进阶指南(11)(指针数组与二维数组)

*欢迎来到博主的专栏——C语言进阶指南
博主id:reverie_ly

文章目录

    • N级指针
    • 指针数组
      • 指针数组与二维数组
      • 数组指针作为函数的参数

N级指针

指针变量是一个存放地址的变量,在C语言中,每个变量都会有一个地址值。所以指针变量也有一个地址。

int main()
{
	int a = 0;
	int* pi = &a;//pi变量的值是a的地址
	int** ppi = π//ppi的值是pi的地址
}

在这里插入图片描述
从vs调试的监视窗口可以看到
pi的类型是int*,存储的是int类型的a的地址。 pi是一级指针
ppi的类型是int**,存储的是int*类型的pi的地址。 ppi是二级指针.
在这里插入图片描述

将存储数据变量地址的指针称为1级指针,存储一级指针地址的指针称为2级指针,以此类推。N级指针存储的是N-1级指针的地址。

指针数组

声明指针数组的标准形式如下

type *name[];

name是标识符,指针数组的声明是先让标识符与数组声明符([])结合,使这个声明是一个数组,然后在声明指针(*),声明这个数组是一个指针的数组。type是指针指向的变量的类型。

以一个指针数组的声明为例

	int a, b, c, d, e;
	int* parr[5] = { &a,&b,&c,&d,&e };

该数组parr是一个 5个元素 都是 指针 的 数组。 分别指向a,b,c,d,e这五个变量。此时可以通过解引用数组的元素来操作这些变量

	int a, b, c, d, e;
	int* parr[5] = { &a,&b,&c,&d,&e };

	*parr[0] = 1;//a=1
	*parr[1] = 2;//b=2
	*parr[2] = 3;//c=3
	*parr[3] = 4;//d=4
	*parr[4] = 5;//e=5

指针数组与二维数组

在数组和指针这一章里我们了解到数组名和指针之间的关系。当数组名作为指针使用时,
指针的值是数组的首元素的地址。
而二维数组的行下标指向的是一维数组的地址。以arr[2][5]为例
在这里插入图片描述
我们可以发现:

指针数组可以充当二维数组的行下标

因为他们都有着类似的作用,即指向一个数组的地址。

	int arr[2][5] = { 0 };
	int* parr[2] = { arr[0],arr[1] };
	for (int i = 0; i < 2; i++)
	{
		for (int j = 0; j < 5; j++)
		{
			parr[i][j] = j;
		}
	}
	return 0;

在该程序中,我们将arr[0]和arr[1]作为指针数组的元素,当对parr进行元素访问操作时,可以得到arr[0]或arr[1]的地址。再对元素进行访问操作,就能得到二维数组中的元素。
在这里插入图片描述

数组指针作为函数的参数

可以将指针数组作为函数原型的参数来对二维数组进行操作。

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

如果将上面例子结合起来,正确的传参形式是
print(parr);

在C语言进阶指南(10)中我们提到了,数组名在作为指针操作时会发生的类型降级的例子。所以上述函数在设计原型时也可以设计为

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

相关文章传送门:
C语言进阶指南(10)(指针与数组)


http://www.kler.cn/news/150259.html

相关文章:

  • 拉普拉斯变换
  • 字母大小写转换
  • PHP微信UI在线聊天系统源码 客服私有即时通讯系统 附安装教程
  • kafka C++实现生产者
  • MYSQL基础语法二
  • 48、Flink DataStream API 编程指南(1)- DataStream 入门示例
  • 基于SpringBoot实现的教务查询系统
  • Java,反射机制与反射的应用
  • 万宾科技水环境综合治理监测系统的融合与应用
  • 从源代码出发,Jenkins 任务排队时间过长问题的解决过程
  • leetCode 131.分割回文串 + 回溯算法 + 图解 + 笔记
  • 【Linux】gcc和g++
  • PHP逻辑运算符学习资料
  • 【网络安全】-安全常见术语介绍
  • C++二分查找算法:包含每个查询的最小区间
  • enote笔记法之附录2——5w1h2k关联词(ver0.22)
  • 深度学习-模型调试经验总结
  • java实现连接linux(上传文件,执行shell命令等)
  • Linux系列:Linux上杀毒软件有哪些?
  • 【HarmonyOS】ArkUI状态管理:组件内状态、装饰器、高级用法与最佳实战【鸿蒙专栏-08】
  • 用代码评论代替代码注释
  • .net core 连接数据库,通过数据库生成Modell
  • 目标检测YOLO系列从入门到精通技术详解100篇-【目标检测】机器视觉(基础篇)(七)
  • 美团YOLOv6量化部署实战方案
  • 数据库其它调优策略
  • 【Openstack Train安装】四、MariaDB/RabbitMQ 安装
  • 深度学习毕设项目 深度学习 python opencv 动物识别与检测
  • Linux 基本语句_13_消息队列
  • Arduino驱动SHT4x温湿度传感器(温湿度传感器)
  • Python内置函数与标准库函数的详细解读