一个小蚂蚁 发表于 2019-4-21 14:14:52

求大佬帮助,一个问题想了很久没想明白






#include <stdio.h>

int main()
{
      int array = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
      int (*p) = &array;

      printf("%d\n", *(*(p+1)-6));

      return 0;
}

我的理解:
前提是把这个array看成一个二维数组:
指针p指向整个数组,可以把array看做是一个二维数组,只不过这个二维数组的列为0,写成 int array,所以p==&array,所以p+1==&arrary,而array可以看做是第二列的首个元素的地址,
所以*(p+1)== *(&array) == arrary 能不能这么理解,但是这么理解又得不出答案。

而且array是一个地址,*(p+1)不应该是一个确定的值而不是地址嘛??
我很困惑,希望大佬能够救济一下我,我这个问题困扰我很久了。

而且小甲鱼的说法 怎么理解,答案4又是怎么来的???

Croper 发表于 2019-4-21 15:03:51

首先,array本身是1维数组,你不能将其看做二维数组。array拥有的这一块数据你确实可以把它看做二维数组,准确地说,你可以把它看成任何东西。但是,这块数据一旦和已经定义了变量类型的变量名array联系起来,那么你就只能把它看做长度为10的一维数组。之后,你array是个地址什么的问题同样也不存在,

第二,同样,p的指针类型是指向(长度为10的整数数组)的指针。这意味着,不管它指向的数据块属于哪个变量名,你只要使用p,那么它都会把这块数据看做(长度为10的整数数组),
那么(p+1)相比p, 就偏离了1个单位的(长度为10的整数数组的长度),也就是偏离了(10个整数长度),
解引用之后再减6,那么就是偏离了(4个整数长度),那么这个值就是array,也就是4

一个小蚂蚁 发表于 2019-4-21 15:08:50

Croper 发表于 2019-4-21 15:03
首先,array本身是1维数组,你不能将其看做二维数组。array拥有的这一块数据你确实可以把它看做二维数组, ...

为什么是arrary4啊,不是这个p指针指向了数据外啊

Croper 发表于 2019-4-21 15:11:00

一个小蚂蚁 发表于 2019-4-21 15:08
为什么是arrary4啊,不是这个p指针指向了数据外啊

(p+1)是指向数据外,但是-6又指回来了啊

一个小蚂蚁 发表于 2019-4-21 15:11:50

Croper 发表于 2019-4-21 15:03
首先,array本身是1维数组,你不能将其看做二维数组。array拥有的这一块数据你确实可以把它看做二维数组, ...

不是应该说指向了这个数组所在之外的空间了嘛

Croper 发表于 2019-4-21 15:17:47

这么想,你可以把数组之外的空间看做炸弹,摸一下就会爆炸那种;
但是指针指向数组之外的空间,就像你指一下炸弹,没有访问(摸到)的话并没有什么大不了,
这个例子就像你指一下炸弹,然后又指回来,摸了摸小绵羊。除了吓人一跳外,并没有什么问题。

一个小蚂蚁 发表于 2019-4-21 15:19:30

一个小蚂蚁 发表于 2019-4-21 15:08
为什么是arrary4啊,不是这个p指针指向了数据外啊

为什么是-6,这个*(*(p+1)-6)怎么理解,我就卡在这里了

Croper 发表于 2019-4-21 15:29:21

所以你理解到哪个地方卡壳的?

全部再解释一遍的话和第一个答案已经做了这件事儿了啊

一个小蚂蚁 发表于 2019-4-21 15:32:22

Croper 发表于 2019-4-21 15:29
所以你理解到哪个地方卡壳的?

全部再解释一遍的话和第一个答案已经做了这件事儿了啊

谢谢
页: [1]
查看完整版本: 求大佬帮助,一个问题想了很久没想明白