二维数组解引用,如何通过指针求值


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) 

当我打印这些时,我得到输出:818-10年83.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,因为它在内存中从[0]的末尾扩展到[1],你得到的是[1][0]。我认为这种行为实际上是未定义的。这取决于C标准是否保证初始化的2D数组将按顺序在内存中分配,并可能导致Segmentation错误或更糟。

相关内容

  • 没有找到相关文章

最新更新