【001 数组】数组知识点

一、一维数组知识

设一个一维数组 int a[4]:

1. 那么 a、&a、&a[0] 有什么区别?

  1. 总结一下,a 和 &a[0] 的值和类型都是相同的(都是指向第一个元素的地址,类型为 int*);
  2. 而 &a 的虽然与 a 相同,但类型不同(&a指向整个数组的指针,类型为 int (*)[4],即数组指针)。
  3. &a[0]和a在大多数情况下是等价的,因为a表示整个数组的首地址,而&a[0]表示数组中第一个元素的地址。&a[0]可以被替换为a。
  4. 但是在某些特殊情况下,它们可能是不同的,例如当a是一个多维数组时,a表示的是整个数组的首地址,而&a[0]表示的是第一行的地址。

2. &a+1、&a[0]+1、a+1有什么区别?

  • &a+1,其中"1"的大小指的是整个数组的所占大小;
  • 而&a[0]+1、a+1,其中的"1"的大小指的是一个元素所占大小;

3. int a[4]中a为什么是伪指针?

  • a本身是一个指针,它指向第一个元素。
  • 但是,与普通指针不同的是,数组名不能被赋值,也不能进行递增或递减操作,因此被称为伪指针。


二、二维数组知识

设一个二维数组 int a[4][5]在二维数组中,元素是一维数组,那么一维数组的地址就是一个二级指针。将二维数组元素 当做一维数组 理解。

1. 那么 *a、a、&a、a[0]、&a[0]、a[0][0]、&a[0][0] 有什么区别?

a:数组a的地址,类型是int(*)[5]。数组名a = &a[0],二维数组数组名表示第一个元素a[0]的地址!为整个第一个一维数组的首地址!

&a:数组a的地址,类型是int(*)[4][5]。

a[0]:第一行元素的首地址。假设第一行元素是b[5],那么a[0]相当于b,&a[0]相当于&b,为整个一维数组的首地址!a[0]理解为一维数组的名字即可!

&a[0]:&a[0]相当于&b,为整个一维数组的首地址!

a[0][0]:数组a的第一个元素的第一个元素。

&a[0][0]:数组a的第一个元素的第一个元素的地址。

2. a+1、&a+1、a[0]+1、&a[0]+1有什么区别?

a+1 :第1行首地址,相当于&a[0]+1,相当于&b+1,相当于跳过整个一维数组大小;

&a+1:相当于跳过整个二维数组大小;
*(a+1) :第1行第零列元素地址,同上理解;
*a+1 :第0行第1列元素地址,相当于a[0]+1,也就是b+1,向后移动一个元素;

a[0]+1:同上,第一个一维数组向后移动一个元素;

&a[0]+1:同上方第一个,相当于b+1,相当于跳过整个一维数组大小;

3. 大小

sizeof(a)  整个二维数组的大小

sizeof(a[0])  第0行的大小,也就是二维数组"第1个元素"大小

sizeof(a[0][0])   第1个元素的大小


三、实例

*(a[1]+1)、*(&a[1][1])、(*(a+1))[1]  // 对于二维数组来说

在二维数组中,元素是一维数组! 第0行0列开始

第一个:因为a[1]是第1行的地址(第一个元素的地址),a[1]+1偏移一个单位(得到第1行第1列的地址),然后解引用取值,得到a[1][1];

第二个:[]优先级高,a[1][1]取地址再取值。

第三个:a+1相当于&a[1],所以* (a+1)=a[1],因此*(a+1)[1]=a[1][1]

a+1 = &a[0]+1 = &a[1];  &a[0]相当于第一个一维数组整体的首地址,加一跳过整个一维数组大小,刚好指向第二个一维数组的首地址,也就是&a[1]。

*(a+1) = *(&a[1]) = a[1];

(*(a+1)) = a[1];

(*(a+1)) [1]=a[1] [1]


四、参考内容

【零碎知识01】二维数组中的*a、a、a[0]、a[0][0]、a[1]、&a[1]_Dooo_yh的博客-CSDN博客_a[1]

  • 1
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Kashine

你的鼓励将是我创作的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值