美文网首页
指针数组计算

指针数组计算

作者: 奔跑的喔汼 | 来源:发表于2020-07-13 11:05 被阅读0次
  • (void)viewDidLoad {

[super viewDidLoad];

int arrayName[4] = {10,20,30,40};

int *p = (int *)(&arrayName + 1);

NSLog(@"%d", *(p - 1));

}

很多小伙伴都很面熟吧,差不多10个人有7个人都不知道这个输出的结果是什么吧,或许有知道答案的,但是仅仅知道答案,心里还是一头雾水。如果你真的不会那就请认真看完本文学习一下吧!

错误想法:

有的人认为

NSLog(@"%d", *(&arrayName + 1 - 1));

加1减1不就是抵消了么,那肯定是访问数组首地址,那打印的值肯定是 10,看起来是通的(引用宋小宝小品海参炒面一句话:汤面没给钱,汤面用炒面换得给什么钱?炒面也没给钱啊,炒面没吃给什么钱?)但是含义是不一样的。

指针是如何加减运算:

  • int *p 的解释:将来的指针是指向int类型

指针p + 1 说明内存地址会加上4个字节(因为是int占4个字节)

如果是 double *p 指针p + 1内存地址会加上8个字节(因为是double占8个字节)

  • 通过上述解释我们得出一个公式:

指针p + n = p当前的地址值 + n *指向类型所占用的字节数

指针p - n = p当前的地址值 - n * 指向类型所占用的字节数

数组与指针:

int arrayName[4] = {10, 20, 30, 40};

上面的数组占16个字节(原因:每个int类型占4个字节,这个数组有4个int类型,所以占16个字节)

arrayName就是数组名

数组名 :表示数组首元素的地址,相当于一个指向数组首元素的指针

相信你已经有点蒙圈了,我们在进一步解释一下:

NSLog(@"%p %p", arrayName, arrayName + 1);

NSLog(@"%p %p", &arrayName, &arrayName + 1);

看看下面的输出结果:

2016-07-17 21:46:00.845 数组与指针笔试题[1861:196315] 0x7fff53a7ca30 0x7fff53a7ca34

2016-07-17 21:46:00.846 数组与指针笔试题[1861:196315] 0x7fff53a7ca30 0x7fff53a7ca40

我们从输出的结果可以知道arrayName 与 &arrayName的地址是相同的,而(arrayName + 1) 与 (&arrayName + 1)输出的结果不一样.

下面就来解释为什么是这样的结果:

  1. arrayName 与 &arrayName

arrayName 是数组名,所以打印出来是数组首元素的地址

&arrayName 含义就是数组的地址(等价于指向arrayName数组的指针),因为没增加1,所以数组的地址就是数组首元素的地址所以 arrayName <->&arrayName 打印出的地址是一样的

2.(arrayName + 1) 与 (&arrayName + 1)

(arrayName + 1)通过上述解释我们知道(arrayName + 1)指针是指向int类型,所以内存地址会加上4个字节

(&arrayName + 1)我们知道&arrayName是数组的地址(等价于指向arrayName数组的指针) 因为增加1,这个数组总共占16个字节,所以内存地址会加上16个字节

最后答案解析

int arrayName[4] = {10, 20, 30, 40};

/**

1.(&arrayName + 1):&arrayName是数组的地址(等价于指向arrayName数组的指针)

2.增加 1 会往后移动16个字节,开始是4个字节的位置,移动后就是16个字节后面的位置(也就是目前位置是20个字节)

3.最后又赋值给,int类型的指针p(int类型占4个字节)

4.所以(p - 1)就是减去4个字节,变成为16个字节的位置,输出的*(p - 1)值为40

*/

int *p = (int *)(&arrayName + 1);

NSLog(@"%d", *(p - 1));//输出结果为 40

相关文章

  • 指针数组计算

    (void)viewDidLoad { [super viewDidLoad]; int arrayName[4]...

  • 混淆知识点

    1、指针数组&数组指针、常量指针&指针常量、函数指针&指针函数 数组指针&指针数组 数组指针的定义 int (*p...

  • C语言的数组指针与指针数组(One)

    一、数组指针与指针数组: 数组指针<——>本质是指针 指针数组<——>本质是数组上图: 二、数组指针: int ...

  • 函数指针

    概念: 指针函数, 函数指针, 指针数组, 数组指针, 指向数组的指针, 指向函数指针数组的指针。

  • 指针与数组和函数的几个关系

    指针数组、数组指针 指针数组。数组的元素类型是指针如:int* a[4] 数组指针。指向数组的指针变量如:int ...

  • C语言指针相关

    一、指针数组 和 数组指针的区别:1:指针数组,还是数组,数组每个元素是指针。2:数组指针,是指针,指向的是数组。...

  • C语言

    C 指针、指针变量、函数指针、指针函数、指针数组、数组指针、C 数组

  • 指针笔记

    指针数组和数组指针 数组指针是指向数组的指针,指针的值与数组首元素地址相同,但范围是整个数组,所以数组指针和数组名...

  • C语言21 指针数组与数组指针

    C语言21 指针数组与数组指针 指针数组的定义 指针数组的赋值 结构体指针数组 分析下面的代码 数组指针的定义 数...

  • JNI基础 -- C++基础知识(指针数组)

    数组和指针,数组指针,指针数组 数组 声明一个数组 这个比较简单,不做过多介绍 数组指针 数组指针是一个指针,指向...

网友评论

      本文标题:指针数组计算

      本文链接:https://www.haomeiwen.com/subject/xitsqktx.html