【问题标题】:2 Dimentional array dereferencing ,how to evaluate through pointers2 维数组解引用,如何通过指针求值
【发布时间】:2011-10-02 05:25:57
【问题描述】:
a[2][3] = {{-3,14,5},{1,-10,8}}

*(a[j]+k) 
*(a[j+k-2]) 
(*(a+j))[k]) 

(*(a+k-1))[j] 
*((*(a+j))+k)) 

(**(a+j)+k) 
*(&a[0][0]+j+k) 

当我打印这些我得到 输出: 8 1 8 -10 8 3 1 分别 请如果有人可以详细解释这些值是如何产生的,我是一个新的初学者,请原谅我在这里的格式不正确,并且还因为这么多的工作而困扰你:)

【问题讨论】:

  • 我不明白您发布的内容。你能解释一下你在问什么吗?
  • 我尝试更好地格式化您的代码。我希望我保留了预期的含义。如果我的替换 ________ 不正确,请告诉我,或者恢复编辑。
  • @paulPRo 谢谢你做得很好
  • @Gabe 当我 printf 7 个表达式时这些值来了,我想问你们这些值是怎么来的
  • @iyer 是的,这是一个棘手的问题.. 请解释这些值是如何产生的

标签: pointers multidimensional-array


【解决方案1】:

我假设 j == 1 和 k == 2:

*(a[j]+k) == *(a[1]+2) :

    a[1] = {1, -10, 8};
    So a[1]+2 is a pointer to 8, and *(a[1]+2) == 8

 

*(a[j+k-2]) == *(a[1+2-2]) == *(a[1]):

    a[1] = {1, -10, 8}
    Since *a[1] is the value of the first element in a[1], the expression evaluates to 1

 

(*(a+j))[k] == (*(a+1))[2]:

    a+1 is a pointer to the second element in a, so *(a+1) == a[1] = {1, -10, 8}
    a[1][2] == 8

 

(*(a+k-1))[j]  == (*(a+2-1))[1] == (*(a+1))[1]:

    *(a+1) == a[1] (see the last answer)
    a[1][1] == -10

 

*((*(a+j))+k) == *((*(a+1))+2):

     *(a+1) == a[1], so the expressions is equivalent to *(a[1]+2)
     *(a[1]+2) is equivalent to a[1][2] for the same reasoning as above, which is 8

 

(**(a+j)+k)  == (**(a+1)+2):

    *(a+1) = a[1]
   **(a+1) = a[1][0] == 1
     Adding 2 to that gives 3

 

*(&a[0][0]+j+k) == *(&a[0][0]+1+2) == *(&a[0][0]+3):

    &a[0][0] == a[0]
    *(a[0]+3) == a[0][3];

最后一个返回 1,因为它在内存中从 a[0] 的末尾扩展到 a[1],而你得到的是 a[1][0]。我认为这种行为实际上是未定义的。这取决于 C 标准是否保证初始化的二维数组将在内存中按顺序分配,并可能导致分段错误或更糟。

【讨论】:

  • 没有比你解释得更好的答案了,继续努力:))
  • 我完全可以看出您是专业人士,但请考虑这一点,从您告诉我的 int a[b][c]; a[d][e] 的值使得 d(a+dc+e) 所以在我们原来的问题中意外的是 a[0][3] =*(a+0*3+3) =*(a+3)......等式 A a[1][0]=*(a+1*3+0 )=*(a+3).......等式 B 相同......如果在数组的声明中它是 int a[2][4] 而不是 int [2][3] 方程 A 和方程 B 会给出不同的答案,因此,每件事在 C 中看起来都很好定义,如果我错了,请告诉我...谢谢 PaulPro
  • ^^^ 很抱歉在评论中回复我的声誉很低无法回答我自己的问题
猜你喜欢
  • 2020-12-16
  • 2023-03-16
  • 2011-08-15
  • 1970-01-01
  • 1970-01-01
  • 2016-05-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多