博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
收藏的数组指针知识点
阅读量:4988 次
发布时间:2019-06-12

本文共 1124 字,大约阅读时间需要 3 分钟。

首先是简单的一维数组

定义一个数组int arr[5]; arr是指向数组第一个元素的int类型指针,arr+1就是指针数组第二个元素的int类型的指针,*arr就是取这个指针里面对应的值,这个比较好理解

int arr[5] = { 1, 2, 3, 4, 5 };//定义数组printf("\n%x", *arr);//1    =arr[0]printf("\n%x", *(arr+1));//2    =arr[1]

到了二维数组这边比较蛋疼,找了很久找到一句话来解释我的疑惑,然后一切就迎刃而解

定义一个二维数组int arr[2][3]

int arr[2][3] = { { 1, 2, 3 }, { 4, 5, 6 } };printf("\n%d", sizeof(*(&arr)));//24printf("\n%d", sizeof(*arr));//12

二维数组分为行和列,这是一个两行三列的数组,

第一个是&arr是取整个数组的指针,对应类型是int[2][3] ,所以它的对应值的大小是24(每个数字占四个字节)。

第二个 arr代表第一行的数组指针,这里可能需要大家动动脑子,在第一个例子一维数组int arr[3] 里面,arr默认就是第一个元素所对应的指针,类型是int,而指针自增每次的增加量=sizeof(你所用的数据类型)

所以arr+1的值会加4(因为一维数组所对应的元素的指针类型是int,4个字节),所以+1会找到数组的下个元素地址,并*地址求得指针地址对应的值,但是二维数组的里面的值不是int类型,而是int[3]

,所以arr是指向二维数组的第一行的指针,也就是对应里面的{1,2,3}的值,所以它的大小是12个字节

 

这个时候我们又运行了一段程序

int arr[2][3] = { { 1, 2, 3 }, { 4, 5, 6 } };printf("\n%x", arr);//printf("\n%x", *arr);//

发现两个的值都是这个数组的首地址,第一个是数组第一行的指针,所以直接打印会打印出第一行的首地址很正常,我们能理解

但是第二个不是应该打印第一行的值吗?

原来是因为使用整行数据没有实际的含义,编译器遇到这种情况都会转换为指向该行第 0 个元素的指针
 就像一维数组的名字,在定义时或者和 sizeof、& 一起使用时才表示整个数组,出现在表达式中就会被转换为指向数组第 0 个元素的指针。
所以如果我们输入 **arr就会打印出该行的第0列的元素的值,也就是1

转载于:https://www.cnblogs.com/TX980502/p/6562034.html

你可能感兴趣的文章
Docker build报错FATA[0000]
查看>>
git的常用命令
查看>>
Python全栈-数据库存储引擎
查看>>
二周第五次课(12月22日)
查看>>
Packet Tracer 5.0 构建CCNA实验(2)—— 配置VLAN
查看>>
contourf和contour用法区别
查看>>
分布式版本控制系统git
查看>>
centos7 memcached+magent+keepalived集群
查看>>
C#,连接打印机
查看>>
验证控件的使用八(分组验证)
查看>>
rdlc 分页
查看>>
显示数据库中的数据
查看>>
JavaWeb_Servlet介绍
查看>>
Spring-事物-不依赖应用服务器的开源JTA事物实现
查看>>
数据传输 -- 字符串报文
查看>>
es6 object.assign()的用法 复制对象---克隆对象
查看>>
Spring4.0+Hibernate4.0+Struts2.3整合包括增删改查案例,解决整合中出现的异常
查看>>
P4240 毒瘤之神的考验
查看>>
P4981 父子 Cayley公式
查看>>
浅谈“观察者模式”那点小事儿
查看>>