liu691 发表于 2022-9-15 17:01:35

关于数组指针的一些疑惑

本帖最后由 liu691 于 2022-9-16 10:33 编辑

在小甲鱼C语言的书上的这个例子里面,在前面的内容说指针指针变量指的是地址,而*是取值运算符,那那在这个地方输出数组值的时候为什么要用*(*p2 + 1)?括号内的*的作用是什么呢,
我分别输出了p2 *p2 还有数组的地址 &temp 发现三者是相同的,

但当我删去括号内的*号时,输出数组的值时出现的数组中各元素的地址,

对于一样的值p2 和 *p2 ,他们所代表的意义的不同之处是什么呢?
如果能够帮我解决一下这个疑惑,万分感谢{:5_92:}


liu691 发表于 2022-9-15 17:05:57

难道是因为p2是指向数组中第一个元素的指针,而又因为我定义的是数组指针,两者产生了冲突

jackz007 发表于 2022-9-15 17:33:15

       p2 是指针,代表的是一个内存地址,而 * p2 则代表 p2 所指向内存里面的东西。
       * p2 = IPhone14 一箱
      这一句给 p2 存入了一箱 IPhone 14,这个 p2 可以理解为 5 号仓库第 3 排货架第 2 层 第16 格,有了这个信息,你就可以很方便的找到这一箱 IPhone 14 了,没错,你只需要表达 * p2 那么,表示的就是这一箱 IPhone 14,这就是 p2 和 * p2 之间的关系。

howzyao 发表于 2022-9-15 21:28:59

temp 是连续的 5个 长度的 长度值为5*int的 空间.
p2指针组 是5个长度 5*4=20字节的空间
其中,你把p2声明时,就指向整个temp空间,这样做,指针会自动分配一一指向temp的各个元素吗?
但看执行结果,你这样做,是实现了,那就是:
p2指向temp;以此类推.

用指针格式 打印p2 得到的 是 p2指针组的 首地址,首地址,也是第一个元素的地址即:
p2的地址.

用指针格式 打印p2 间接访问,这会是什么值,意思不明确.

用批针格式打印 引用temp地址, 打印的,应当是temp的地址,也是temp第0个元素的地址

howzyao 发表于 2022-9-15 21:30:41

*p2 只能是获得 首地址 中的 整型值 即 第0个元素指向的 地址里的 整型值

liu691 发表于 2022-9-16 10:32:54

搞明白了,感谢各位

howzyao 发表于 2022-9-16 12:53:17

*(*p2 + 1)
其实我在楼上也说错了,现在重说,大家看对不对:
这个牵扯到 右值 的概念。
括号优先,所以,此时的右值是 括号中的值,看括号中,*号优先于+号,所以,此时的右值是以下描述:
为了讲清楚,先设有地址两个见下面:
p2的地址是0x1111 此时,这个地址是指针存放的空间。这个地址就是指针自己,不涉及任何概念,如果不指向别处,那么就是危险的,所以,c提供了0 或者 NULL,来作为它的初始化。

由于声明了指向,所以p2一定是对地址0x0000的指向,此时指针的含义,就不像上面描述的那样,不再单纯了。

此时,这个指向的过程,叫做 引用
引用的是什么?我觉得,引用的是地址0x0000

既然引用了,也知道0x0000空间中存的是一个int结构的对象,那么对应的,p2就一定是一个专门指向int地址的。所以p2也只能是int类型。这是c的使用制度的道理所在,即: int *p;只能引用int类型的地址,写作 p=&x;x必须是int类型的变量。当然,&号,就叫做了 取地址操作符 简称 取址符。代表x的地址,取出来,作为 右值 存在,再把 右值&x 赋给p。

howzyao 发表于 2022-9-16 13:19:55

说完了这些废话,此时,p2就是地址了。
*号 叫做 取得地址中实际变量的操作符
叫这么长,也许是我的错,但确实涉及了 引用
一词: 解除引用。叫的晦涩难懂,上楼讲了自己眼中的 引用是什么。所以这里就直接简称 :
间接取值操作符
取了 指向地址x中的 实际整数。
所以,在*号工作完毕之后,右值 p2成了一个整数
,由于括号的存在,整数+整数后 成了另外一个 右值。
看楼主代码:第10行,当第0个元素是1时,p2为1,然后,1+i=1,第一次循环,i初始化为了0,但此时,已经打印了第0个元素的值,这个值,是*(1+0),打印的格式,是%p
取地址的格式,这是其一。其二,是括号中的右值,是一个整数1,对1 解除引用,或者说对1作取值操作,或者说乘以1等等,总之,这个上下文联系中,这个操作,就是其中之一。
为了求证这个结果,请看上机实际结果。

howzyao 发表于 2022-9-16 13:22:26

howzyao 发表于 2022-9-16 13:58:28

实际看来,对(1+i))进行*操作,得到的 右值,是截图中 eax 0x20x2地址的解释,是2
所以,打印的,都是无意义的0000002.实际上的意义,我估计,2,代表元素0的地址长度2字节,即0000 0000 0000 0000
0000002的输出:

esp(32位)/rsp(64位):
栈顶指针,指向栈的顶部.
ebp(32位)/rbp(64位):
栈底指针,指向栈的底部,用ebp+偏移量的形式来定位函数存放在栈中的局部变量.

mov    %edi,%edi 有可能是这个值.


如果这样,那么,打印出来的,是每个元素01234分别和i相加的"间隔"数 2

以上纯猜测.

欢迎有知道的坛友来指导一下.谢谢.

lpzju 发表于 2023-1-31 21:34:47

liu691 发表于 2022-9-16 10:32
搞明白了,感谢各位

你好,能完整说一下你的理解吗
页: [1]
查看完整版本: 关于数组指针的一些疑惑