C语言中指针在二维数组中的一些应用

#include <stdio.h>

int main() {
  int zippo[4][2] = { { 2, 4 }, { 6, 8 }, { 1, 3 },  { 5, 7 } };
  // zippo 二维数组的首元素地址(即zippo[0]的地址,类型为int (*)[2])
  printf("zippo = %p\n", zippo); 
  // zippo+1 指向二维数组第二个元素的地址(即zippo[1]的地址,类型为int (*)[2])
  printf("zippo + 1 = %p\n", zippo + 1); 
  // zippo[0] 二维数组第一个元素的地址(即第一个一维数组的地址,类型为int*)
  printf("zippo[0] = %p\n ", zippo[0]);
  // *zippo[0] 二维数组第一个元素中第一个元素的值:2
  printf("*zippo[0] = %d\n ", *zippo[0]);
  // zippo[0] + 1 二维数组第一个元素中第二个元素的地址(即第一个一维数组中第二个元素的地址)
  printf("zippo[0] + 1 = %p\n", zippo[0] + 1);
  // *(zippo[0] + 1) 二维数组第一个元素中第二个元素的值:4
  printf("*(zippo[0] + 1) = %d\n", *(zippo[0] + 1));
  // *zippo 二维数组第一个元素的地址(即第一个一维数组的地址,类型为int*)
  printf("*zippo = %p\n", *zippo); 
  // **zippo 二维数组第一个元素中第一个元素的值:2
  printf("**zippo = %d\n", **zippo); 
   // *zippo + 1 二维数组第一个元素(即第一个一维数组)中第二个元素的地址
  printf("*zippo+1 = %p\n", *zippo+1); 
  // *(*zippo + 1) 二维数组第一个元素(即第一个一维数组)中第二个元素的值:4
  printf("*(*zippo + 1) = %d\n", *(*zippo + 1)); 
  // zippo[0][0] 二维数组第一个元素(即第一个一维数组)中第一个元素的值:2
  printf("zippo[0][0] = %d\n", zippo[0][0]);
  // *zippo[1] 二维数组第二个元素(即第二个一维数组)中第一个元素的值:6
  printf("*zippo[1] = %d\n", *zippo[1]);
  // *(*zippo+1) 二维数组第一个元素(即第一个一维数组)中第二个元素的值:4
  printf("*(*zippo+1) = %d\n", *(*zippo+1));
  // *(zippo[0]+1) 二维数组第一个元素(即第一个一维数组)中第二个元素的值:4
  printf("*(zippo[0]+1) = %d\n", *(zippo[0]+1));
  // *(*(zippo+2) + 1) 二维数组第三个元素(即第三个一维数组)中第二个元素的值:3
  printf("*(*(zippo+2) + 1) = %d\n", *(*(zippo + 2) + 1));
  // 声明一个指向内含两个int类型元素的一维数组的指针
  int(*pz)[2];
  // pz 指向 zippo 第一个元素的地址(即第一个一维数组的地址)
  pz = zippo;
  // pz 的值(即 zippo 的值):二维数组的首地址
  printf("pz = %p\n", pz);
  // pz[0] 二维数组第一个元素的地址(即第一个一维数组的地址)
  printf("pz[0] = %p\n", pz[0]);
  // *pz[0] 二维数组第一个元素中第一个元素的值:2
  printf("*pz[0] = %d\n", *pz[0]);
  // pz[0] + 1 二维数组第一个元素中第二个元素的地址(即第一个一维数组中第二个元素的地址)
  printf("pz[0]+1 = %p\n", pz[0]+1);
  // *(pz[0] + 1) 二维数组第一个元素中第二个元素的值:4
  printf("*(pz[0]+1) = %d\n", *(pz[0]+1));
  // *pz 二维数组第一个元素的地址(即第一个一维数组的地址)
  printf("*pz = %p\n", *pz);
  // **pz 二维数组第一个元素中第一个元素的值:2
  printf("**pz = %d\n", **pz);
  // **pz + 1 第一个元素的值加一:3
  printf("**pz+1 = %d\n", **pz+1);
  // *pz + 1 第一个元素中第二个元素的地址(即第一个一维数组中第二个元素的地址)
  printf("*pz+1 = %p\n", *pz+1);
  // *(*pz + 1) 二维数组第一个元素中第二个元素的值:4
  printf("*(*pz+1) = %d\n", *(*pz+1));
  // pz + 1 二维数组第二个元素的地址
  printf("pz+1 = %p\n", pz+1);
  // *(pz + 1) 二维数组第二个元素的地址(即第二个一维数组的地址)
  printf("*(pz+1) = %p\n", *(pz+1));
  // **(pz + 1) 二维数组第二个元素中第一个元素的值:6
  printf("**(pz+1) = %d\n", **(pz+1));
  // pz[0][0] 二维数组第一个元素中第一个元素的值:2
  printf("pz[0][0] = %d\n", pz[0][0]);
  // pz[2][1] 二维数组第三个元素中第二个元素的值:3
  printf("pz[2][1] = %d\n", pz[2][1]);
  // *(*(pz + 2) + 1) 二维数组第三个元素中第二个元素的值:3
  printf("*(*(pz+2) + 1) = %d\n", *(*(pz + 2) + 1));
  return 0;
}

为了方面理解和对比,下面表格里面对应的是打印内容和对应的输出值(mac)

打印内容输出的值注释内容
zippo0x7ff7bfb73df0

二维数组的首元素地址(即zippo[0]的地址,类型为int (*)[2])

zippo + 10x7ff7bfb73df8

指向二维数组第二个元素的地址(即zippo[1]的地址,类型为int (*)[2])

zippo[0]0x7ff7bfb73df0

二维数组第一个元素的地址(即第一个一维数组的地址,类型为int*)

*zippo[0]2

二维数组第一个元素中第一个元素的值:2

zippo[0] + 10x7ff7bfb73df4

二维数组第一个元素中第二个元素的地址(即第一个一维数组中第二个元素的地址)

*(zippo[0] + 1)4

二维数组第一个元素中第二个元素的值:4

*zippo0x7ff7bfb73df0

二维数组第一个元素的地址(即第一个一维数组的地址,类型为int*)

**zippo2

二维数组第一个元素中第一个元素的值:2

*zippo+10x7ff7bfb73df4

二维数组第一个元素(即第一个一维数组)中第二个元素的地址

*(*zippo + 1)4

二维数组第一个元素(即第一个一维数组)中第二个元素的值:4

zippo[0][0] 2

二维数组第一个元素(即第一个一维数组)中第一个元素的值:2

*zippo[1]6

二维数组第二个元素(即第二个一维数组)中第一个元素的值:6

*(*zippo+1)4

二维数组第一个元素(即第一个一维数组)中第二个元素的值:4

*(zippo[0]+1)4

二维数组第一个元素(即第一个一维数组)中第二个元素的值:4

*(*(zippo+2) + 1)3

二维数组第三个元素(即第三个一维数组)中第二个元素的值:3

pz0x7ff7bfb73df0

二维数组的首地址

pz[0]0x7ff7bfb73df0

二维数组第一个元素的地址(即第一个一维数组的地址)

*pz[0]2

二维数组第一个元素中第一个元素的值:2

pz[0]+10x7ff7bfb73df4

二维数组第一个元素中第二个元素的地址(即第一个一维数组中第二个元素的地址)

*(pz[0]+1)4

二维数组第一个元素中第二个元素的值:4

*pz0x7ff7bfb73df0

二维数组第一个元素的地址(即第一个一维数组的地址)

**pz2

二维数组第一个元素中第一个元素的值:2

**pz+1 3

二维数组第一个元素中第一个元素的值加一:3

*pz+10x7ff7bfb73df4

第一个元素中第二个元素的地址(即第一个一维数组中第二个元素的地址)

*(*pz+1)4

二维数组第一个元素中第二个元素的值:4

pz+10x7ff7bfb73df8

二维数组第二个元素的地址

*(pz+1)0x7ff7bfb73df8

二维数组第二个元素的地址(即第二个一维数组的地址)

**(pz+1)6

二维数组第二个元素中第一个元素的值:6

pz[0][0]2

二维数组第一个元素中第一个元素的值:2

pz[2][1]3

二维数组第三个元素中第二个元素的值:3

*(*(pz+2) + 1)3

二维数组第三个元素中第二个元素的值:3

里面的有些地址一样是因为数组的地址和数组首元素的地址有时是相同的,但在概念上还是存在一些区别的,对于一维数组,数组的地址就是数组首元素的地址,对于多维数组,数组的地址是整个数组的地址,而数组首元素的地址是第一个子数组(或第一行数组)的地址,用指针的时候还是要注意一下的。

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
未来社区的建设背景和需求分析指出,随着智能经济、大数据、人工智能、物联网、区块链、云计算等技术的发展,社区服务正朝着数字化、智能化转型。社区服务渠道由分散向统一融合转变,服务内容由通用庞杂向个性化、服务导向转变。未来社区将构建数字化生态,实现数据在线、组织在线、服务在线、产品智能和决策智能,赋能企业创新,同时注重人才培养和科研平台建设。 规划设计方面,未来社区将基于居民需求,打造以服务为心的社区管理模式。通过统一的服务平台和应用,实现服务内容的整合和优化,提供灵活多样的服务方式,如推送式、订阅式、热点式等。社区将构建数据与应用的良性循环,提高服务效率,同时注重生态优美、绿色低碳、社会和谐,以实现幸福民生和产业发展。 建设运营上,未来社区强调科学规划、以人为本,创新引领、重点突破,统筹推进、整体提升。通过实施院落+社团自治工程,转变政府职能,深化社区自治法制化、信息化,解决社区治理的重点问题。目标是培养有活力的社会组织,提高社区居民参与度和满意度,实现社区治理服务的制度机制创新。 未来社区的数字化解决方案包括信息发布系统、服务系统和管理系统。信息发布系统涵盖公共服务类和社会化服务类信息,提供政策宣传、家政服务、健康医疗咨询等功能。服务系统功能需求包括办事指南、公共服务、社区工作参与互动等,旨在提高社区服务能力。管理系统功能需求则涉及院落管理、社团管理、社工队伍管理等,以实现社区治理的现代化。 最后,未来社区建设注重整合政府、社会组织、企业等多方资源,以提高社区服务的效率和质量。通过建立社区管理服务综合信息平台,提供社区公共服务、社区社会组织管理服务和社区便民服务,实现管理精简、高效、透明,服务快速、便捷。同时,通过培育和发展社区协会、社团等组织,激发社会化组织活力,为居民提供综合性的咨询和服务,促进社区的和谐发展。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值